对于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可以直接与数据源工作,而不需要事务?
如果不是,这是预期行为吗?或者测试类是否需要额外的东西?
注意该应用程序使用唯一的DataSource
与MySQL
一起使用
您的@Sql
注释被忽略,因为SqlScriptsTestExecutionListener
不活跃…因为spring-tx
和spring-jdbc
不在类路径上。
这些是必需的:如果您查看SqlScriptsTestExecutionListener
的源代码,您可以在导入中看到侦听器使用来自spring-jdbc
的ResourceDatabasePopulator
和来自spring-tx
的各种类型。
但是,如果缺少这些依赖项中的一个,则不会将异常传播给用户,因为它不一定是错误。
理由:Spring TestContext Framework尝试注册所有默认的TestExecutionListener
s。如果其中一个侦听器无法加载——例如,由于类路径中缺少依赖——Spring将在DEBUG
级别记录该日志。
这是为了支持"optional"听众。实际上,几乎所有的侦听器都是可选的。这既适用于spring-test
提供的监听器,也适用于Spring投资组合项目(Boot、Security等)和任何第三方库提供的监听器。