如果我只想测试JdbcTemplate代码,@ DataJpaTest的等价物是什么?

che*_*tts 10 java testing spring-boot

Spring Boot 1.4提供了一些出色的测试改进.一个是@DataJpaTest注释,它只连接JPA测试所需的部分.只需连接JdbcTemplate测试所需的部件即可获得相同的效果?

我很好地构建我自己的复合注释,模仿那个@DataJpaTest.

Ste*_*oll 20

好问题.具有讽刺意味的是,昨天在SpringOne平台的测试谈话中提出了这个问题.让我们看看实现这种专用测试注释需要什么.

TL;DR 检查github上的代码

首先,您需要创建注释.该注释重用了spring-boot-test-autoconfigure模块中的一些位.您可能希望自动配置内存数据库(DataJpaTest如果).您还希望确保默认配置和禁用缓存(如果您使用的@EnableCaching是Spring Boot应用程序).您还希望所有测试都是@Transactional默认的,因此您应该添加它.

接下来,您希望切片有效地完成.此时您需要的只是a DataSource,a JdbcTemplate,数据库迁移(flyway/liquibase)和要处理的事务管理器@Transactional.要避免其他自动配置启动,您应添加以下内容:

@OverrideAutoConfiguration(enabled = false)
Run Code Online (Sandbox Code Playgroud)

然后,您要显式启用上面的自动配置.为此,您添加@ImportAutoConfiguration并添加以下内容META-INF/spring.factories

# AutoConfigureDataJpa auto-configuration imports
com.example.test.autoconfigure.jdbc.DataJdbcTest=\
org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\      
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\    
org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration
Run Code Online (Sandbox Code Playgroud)

键入spring.factories应与您的注释的FQN匹配.每当Spring Boot @ImportAutoConfiguration找不到额外的属性时,它将查找与注释类型匹配的键spring.factories.

接下来,您希望能够使用过滤器包含其他组件(组件扫描).为了做到这一点,你可以添加@TypeExcludeFilters(DataJdbcTypeExcludeFilter.class)在那里DataJdbcTypeExcludeFilter是几乎同样的事情,DataJpaTypeExcludeFilter(所以我们可能要提取一个普通类).

完成后,您只需添加注释即可JdbcTemplate自动配置

@RunWith(SpringRunner.class)
@DataJdbcTest
public class DataJdbcSampleTests {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的出色答案!另外,我是在会议中提出问题的人;) (3认同)