当前位置: 首页 > 知识库问答 >
问题:

使用@sql锁的Spring Boot测试表和存储库以及服务无法读取

索卓
2023-03-14

我也可以手动确认此锁定,但在测试运行时,我不能使用SQL Server Management Studio执行查询(等待并在结束测试时完成)。

我是否可以使用@sql或任何其他数据准备工具进行测试,并让应用程序正常工作,同时还可以在测试后回滚更改?

测试类:

@SpringBootTest(classes = ...App.class)
@ActiveProfiles(profiles = "test")
@ExtendWith(SpringExtension.class)
@Transactional
public class SeleniumExampleIT {
    @LocalServerPort
    protected int port;

    protected WebDriver driver;
    protected NgWebDriver ngWebDriver;

    @BeforeAll
    public static void setupClass() {
        WebDriverManager.chromedriver().setup();
    }

    @BeforeEach
    public void setupTest() {
        var chromeDriver = new ChromeDriver();
        driver = chromeDriver;
        ngWebDriver = new NgWebDriver(chromeDriver);
        ngWebDriver.waitForAngularRequestsToFinish();
    }

    @AfterEach
    public void teardown() {
        if (driver != null) {
            driver.quit();
        }
    }

    @Test
    @Sql({"classpath:sql/test.sql"})
    void listEmployeesTest() {
        //...starting selenium
        // navigating, waiting ..etc
    }
}

EmployeeRepository:

@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
    @Query("SELECT DISTINCT e FROM Employee e " +
        "LEFT JOIN FETCH e.settings")
    List<Employee> findAll();
    @Query("SELECT DISTINCT e FROM Employee e " +
        "LEFT JOIN FETCH e.settings " +
        "WHERE e.id = :id")
    Optional<Employee> findById(@Param("id") Long id);
}

共有1个答案

房唯
2023-03-14

我能找到的唯一解决方案是不使用@transactional测试。我创建了一个单独的数据库,只用于测试运行。在每次测试之前,我使用如下脚本清理数据库:

-- CHECK IF DATABASE HAS TESTING ALLOWED
IF (OBJECT_ID('dbo.tests_allowed') IS NULL)
BEGIN
    RAISERROR('Testing is NOT allowed in the selected database! Please, check carefully, before removing all data! If you want to allow testing, create table dbo.`tests_allowed`.', 16, 1)
END;

-- DISABLE CHECKS
ALTER TABLE dbo.<table-names> NOCHECK CONSTRAINT ALL;

-- TRUNCATE TABLES
DELETE FROM dbo.<table-names>;

-- ENABLE CHECKS
ALTER TABLE dbo.<table-names> WITH CHECK CHECK CONSTRAINT ALL;

truncate运行后,我用data insert脚本准备数据库,执行如下:

@Test
@DisplayName("Checking settings....")
@Sql(value = {"classpath:sql/truncate-tables.sql", "classpath:sql/example-dataset-1.sql"},
    config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED))
public void check...Test() {}

使用隔离模式,Sql文件将立即提交,我可以在测试期间读取数据。

    null
 类似资料:
  • 在我的保险库和领事整合我有以下秘密引擎enble 以以下错误结束 待覆盖的Vault-Value其他:待覆盖的Vault-Value已成功连接到数据库 在上下文初始化期间-取消刷新尝试:org.springframework.beans.factory.BeanCreationException:创建名为“demo application”的bean时出错:调用init方法失败;嵌套异常为java

  • 我在Spring Boot应用程序中有@Service,它正在解析文件,然后使用Spring数据JPA将其存储到DB中。我想用改变这个映射的所有逻辑来测试这个解析。为此,我需要在测试中将映射存储在DB中。 问题是在使用注解@SpringBootTest进行测试期间,我不想加载整个上下文,而只想加载我的ParsingService。当我写作时: 无法初始化此测试,因为我没有在@SpringBootT

  • 我正在为我的应用程序使用模拟存储库 以下是服务的外观片段: 以下是存储库代码: 当我使用执行main()时,它工作正常。 但是,当我想运行测试类: 它会因以下stacktrace而失败: 原因:org。springframework。豆。工厂NoSuchBean定义异常:没有类型为“edu”的合格bean。勒勒亚克。存储库。WeatherStationRepositoryMock’可用:至少需要1

  • 问题内容: 如果我有如下代码: 在开始和提交之间,正在读取的表是否被锁定,并且随后是否会在多用户环境中引起问题,在该环境中,当另一个用户调用上面的相同代码时会发生问题? 如果以上情况有问题,我们是否应始终尝试缩短交易时间?并为此提供便利,而不是在懒惰的关系上调用getter方法,这是否意味着最好使交易简短并为父母的子女手动查找? 问题答案: Hibernate不会做任何事情来显式锁定您从中读取的表

  • 我已经设法模拟了一个实体框架dbcontext和dbset,以允许针对存储库组件进行单元测试、查询功能。 我无法使用实体框架的AddOrUpdate()方法对a方法执行成功的测试。收到的错误是: “无法对派生得IDbSet类型”Castle.proxies.dbSet“1Proxy”调用公共实例方法AddOrUpdate.找不到方法.“ 有可能测试这个吗?

  • 我不能在我的服务课上用我的积垢。我可以创建存储库,但当我将其自动连接到我的服务类时,会出现以下错误: com中构造函数的参数0。测验服务testService需要“com”类型的bean。测验存储库。找不到TestRepository“”。 行动: 考虑定义COM类型的bean。测验存储库。配置中的TestRepository。 这对许多人来说似乎是一个大问题。我尝试了各种东西,如@Compone