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