为什么@Sql在我的Spring集成测试中被忽略?



对于Spring Framework 6 -用于学术目的@Repository直接与DataSource工作。所以没有既不涉及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脚本是而不是因为被忽略而执行

.不是执行,因为测试方法由于断言而失败,并且它们被忽略因为作为一个简单的实验,它为脚本文件建立了无效路径,例如:

@Sql(脚本={"类路径:/xxxcom/manuel/jordan/mysql/v1/insert.sql"})

由于断言,测试方法失败,如之前所示from beginnever因为脚本文件不存在,所以没有找到脚本文件。

  • @Sql可以直接与数据源工作,而不需要事务?

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

注意该应用程序使用唯一的DataSourceMySQL一起使用

您的@Sql注释被忽略,因为SqlScriptsTestExecutionListener不活跃…因为spring-txspring-jdbc不在类路径上。

这些是必需的:如果您查看SqlScriptsTestExecutionListener的源代码,您可以在导入中看到侦听器使用来自spring-jdbcResourceDatabasePopulator和来自spring-tx的各种类型。

但是,如果缺少这些依赖项中的一个,则不会将异常传播给用户,因为它不一定是错误

理由:Spring TestContext Framework尝试注册所有默认的TestExecutionListeners。如果其中一个侦听器无法加载——例如,由于类路径中缺少依赖——Spring将在DEBUG级别记录该日志。

这是为了支持"optional"听众。实际上,几乎所有的侦听器都是可选的。这既适用于spring-test提供的监听器,也适用于Spring投资组合项目(Boot、Security等)和任何第三方库提供的监听器。

最新更新