Spring试验:@Sql直接使用DataSource而不使用事务

bq3bfh9z  于 2023-04-04  发布在  Spring
关注(0)|答案(1)|浏览(173)

对于Spring Framework 6 -用于学术目的@Repository直接与DataSource一起工作。因此no既不涉及JdbcTemplate也不涉及DataSourceTransactionManager@Repository实现了许多CRUD方法。它们按预期工作,并且有一个Test类来测试一系列crud事件,例如:插入,查找,计数,更新,查找,计数等...它例如:

@SpringJUnitConfig(classes={AppConfig.class})
    @DisplayName("Testing All CRUD Test Methods according with a specific order")
    @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
    class CientificoServiceCrudTests {
    
        @Autowired
        private CientificoService cientificoService;

    ...

都过去了。
但当@SQL涉及如下:

@Sql(scripts={"classpath:com/manuel/jordan/mysql/v1/schema.sql",
                  "classpath:com/manuel/jordan/mysql/v1/data.sql"})
    @SpringJUnitConfig(classes={AppConfig.class})
    @DisplayName("Testing All CRUD Test Methods according with a specific order")
    @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
    class CientificoServiceCrudTests {
    
       ...
    
       @Test
       @Order(3)
       @Sql(scripts={"classpath:/com/manuel/jordan/mysql/v1/insert.sql"})
       @DisplayName("Testing 'save' with 'id' 14")
       void saveWithId14Test() {
         ...

已确认@Sql脚本执行,因为它们被忽略
它们没有执行,因为测试方法由于Assert而失败,并且它们被忽略,因为作为一个简单的实验,如果为脚本文件建立了无效路径,例如:
@Sql(scripts={“classpath:/xxxcom/manuel/jordan/mysql/v1/insert.sql”})
测试方法失败 * 如前所述 * 由于Assert从一开始从未报告脚本文件未找到,因为它不存在-这是可以预期的。

问题

  • @Sql可以直接使用DataSource而不使用事务吗?

如果不是,这是一个预期的行为吗?或者测试类需要一些额外的东西吗?

注意应用使用了唯一的DataSource,可与MySQL配合使用

ffdz8vbo

ffdz8vbo1#

您的@Sql注解将被忽略,因为SqlScriptsTestExecutionListener不活动...因为spring-txspring-jdbc不在类路径上。
这些是必需的:如果查看SqlScriptsTestExecutionListener的源代码,您可以在导入中看到侦听器使用来自spring-jdbcResourceDatabasePopulator和来自spring-tx的各种类型。
但是,如果缺少其中一个依赖项,则不会向用户传播异常,因为它不一定是 error
理由:Spring TestContext Framework 尝试注册所有 defaultTestExecutionListener s。如果其中一个侦听器无法加载-例如,由于classpath中缺少依赖项- Spring将在DEBUG级别记录该事件。
这是设计:以支持“可选”监听器。实际上,几乎所有监听器都是可选的。这适用于spring-test提供的监听器以及Spring组合项目( Boot ,Security等)和任何第三方库提供的监听器。

相关问题