Spring 测试:@Sql 直接使用 DataSource 而无需事务

问题描述 投票:0回答:1

对于 Spring Framework 6 - 用于学术目的

@Repository
直接与
DataSource
一起工作。因此,既不涉及JdbcTemplate也不涉及
DataSourceTransactionManager
no
@Repository
实现了许多 CRUD 方法。它们按预期工作,并且有一个测试类来测试一系列 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
脚本 not 执行,因为它们被 ignored.

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

@Sql(scripts={"classpath:/xxxcom/manuel/jordan/mysql/v1/insert.sql"})

测试方法失败如前所述由于断言但是从一开始never据报道找不到脚本文件,因为它不存在-正如预期的那样。

问题

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

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

Note该应用程序使用独特的

DataSource
MySQL

一起使用
spring spring-test
1个回答
1
投票

您的

@Sql
注释被忽略,因为
SqlScriptsTestExecutionListener
未激活...因为
spring-tx
spring-jdbc
不在类路径上。

那些是必需的:如果您查看

SqlScriptsTestExecutionListener
的源代码,您可以在导入中看到监听器使用
ResourceDatabasePopulator
spring-jdbc
spring-tx
的各种类型。

但是,如果缺少这些依赖项之一,则不会向用户传播异常,因为它不一定是error

基本原理:Spring TestContext Framework 尝试注册所有default

TestExecutionListener
s。如果无法加载其中一个侦听器——例如,由于类路径中缺少依赖项——Spring 将在
DEBUG
级别记录它。

这是设计使然:支持“可选”听众。实际上,几乎所有的侦听器都是可选的。这适用于

spring-test
提供的侦听器以及 Spring 组合项目(Boot、Security 等)和任何第三方库提供的侦听器。

© www.soinside.com 2019 - 2024. All rights reserved.