如何测试 Spring Boot JdbcTest 切片

Posted

技术标签:

【中文标题】如何测试 Spring Boot JdbcTest 切片【英文标题】:How to test Spring boot JdbcTest slice 【发布时间】:2021-11-30 18:40:05 【问题描述】:

我确信我不是第一个面对这个问题的人,但无论是 spring 文档还是谷歌,或者这个网站上的其他帖子都没有把我带到我可以遵循端到端示例的地方,以便我可以根据我的用例调整它。

我们有一个相当复杂的 Spring Boot 应用程序,其中包含大量 bean、REST API、消息传递和 DB 集成、预定服务等。

在此设置的一部分中,我们有一个存储库 bean(比如 MyRepository),我们希望对其运行一些集成测试,以确保它的行为符合我们的预期。这很重要,因为它正在运行一些相当复杂的 SQL,这些 SQL 对保持正确至关重要。

数据源在 application.yaml 中配置,我们希望能够自动装配一个 JdbcTemplate bean,这将允许我们准备我们的测试数据和MyRepository bean 上的实例被测。 重要的是不要仅仅为了使它们可用而加载完整的应用程序。

到目前为止,我尝试了@JdbcTest@ContextConfiguration@SpringBootTest@TestConfiguration 等的各种组合,但我无法让它做我想做的事情。

在我的其他一个非常古老的 spring 项目中,我创建了 org.springframework.test.context.ContextLoader 的自定义实现,但现在我们有了 spring boot,在我看来似乎是在重新发明***。

我们使用的是 Spring Boot 2.4.6 版本。

如果有几行甚至没有运行的代码,我会很感激,这会让我走上正轨。

提前致谢。

【问题讨论】:

您使用的是 Spring Data JPA 还是这些自行实现的存储库? @DataJpaTest annotation should get you pretty far for testing your persistence layer。如果这不起作用,请让我更具体地说明使用此注释时什么不起作用 我没有为此使用 JPA。只是使用 JDBC 模板执行的 SQL 的老式自定义 DAO 您能否分享使用@JdbcTest 以及您的一个存储库和相应的测试时出现的问题? 【参考方案1】:

问题是我们使用自定义注释而不是@SpringBootApplication 注释主类,因此@JdbcTest 无法加载配置。我不知道这一点,这让我头疼了好几天:-)。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Import(MyCompanyAutoconfiguration.class)
@Inherited
@Documented
@SpringBootApplication
@EnableCircuitBreaker
public @interface MyCompanyApplication 
    @AliasFor(
        annotation = SpringBootApplication.class
    )
    Class<?>[] exclude() default ;

    @AliasFor(
        annotation = SpringBootApplication.class
    )
    String[] excludeName() default ;

    @AliasFor(
        annotation = SpringBootApplication.class
    )
    String[] scanBasePackages() default ;
    
    @AliasFor(
        annotation = SpringBootApplication.class
    )
    Class<?>[] scanBasePackageClasses() default ;

一旦我添加了以下代码,一切就开始工作了。

@JdbcTest
@ActiveProfiles("test")
@Import(MyRepository.class)
@ContextConfiguration(classes = MyCompanyApplication.class)
@AutoConfigureTestDatabase(replace= AutoConfigureTestDatabase.Replace.NONE)
public class MyRepositoryTest 
    ...

【讨论】:

以上是关于如何测试 Spring Boot JdbcTest 切片的主要内容,如果未能解决你的问题,请参考以下文章

spring boot项目如何测试,如何部署

如何 JUnit 测试 Spring-Boot 的 Application.java

如何使用 spring boot 和 spock 运行测试容器

Spring Boot 集成测试。如何测试“删除”方法?

如何创建 Spring Boot 测试套件

如何同时运行 Spring Boot 测试?