JUnit 4 & Spring Boot - 在测试前有选择地重新加载上下文/重新加载 Spring Security 配置

Posted

技术标签:

【中文标题】JUnit 4 & Spring Boot - 在测试前有选择地重新加载上下文/重新加载 Spring Security 配置【英文标题】:JUnit 4 & Spring Boot - selectively reload context/reload Spring Security configuration before test 【发布时间】:2018-01-08 12:59:49 【问题描述】:

我使用 SpringJUnit4ClassRunner 为 Spring Boot 应用程序运行集成测试。

在搜索过程中,我发现可以使用 @DirtiesContext 重新加载应用上下文。

我的问题:我只需要重新加载安全配置(这取决于数据库条目),而其余部分保持不变(或者准确地说:我需要保持 H2 数据库不变)。

如何在 JUnit 测试之前只重新加载安全配置?

【问题讨论】:

【参考方案1】:

如果您需要保持 H2 数据库原样,您可以考虑将属性 spring.jpa.hibernate.ddl-auto 设置为 update,因为如果数据库不存在,它将创建数据库,如果存在,它将保持现有数据库。如果您已经有一个application-test.properties,您可以创建另一个属性,例如application-securityTest.properties

#... Your DB connection info
spring.jpa.hibernate.ddl-auto=update

然后在您的测试类中,您需要使用注释@ActiveProfiles 激活此配置文件并使用@DirtiesContext 重新加载Spring 上下文:

@ActiveProfiles("securityTest")
@DirtiesContext(classMode = ClassMode.BEFORE_EACH_TEST_METHOD)
public class SecurityTest  ... 

【讨论】:

我正在使用 Liquibase,忘了说。或者另一种方法:如何在Spring Boot开始加载应用程序上下文之前将数据(它只是启动Boot应用程序所需的一条记录)插入DB? 您可以这样做:docs.spring.io/spring-boot/docs/current/reference/html/… 或者您可以使用您的插入语句编写一个 SQL 脚本并在测试执行之前执行它 (***.com/a/1497614/4857050)【参考方案2】:

我用另一种方式解决了这个问题,我修改了实现,以便可以在运行时可变地修改安全配置,并且在启动时不需要数据库条目。

【讨论】:

以上是关于JUnit 4 & Spring Boot - 在测试前有选择地重新加载上下文/重新加载 Spring Security 配置的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Boot 2.1.15.RELEASE(junit 4) 进行集成测试的 Bean 自动装配为 null

Gradle 5 JUnit BOM 和 Spring Boot 版本不正确

Spring Boot junit5 测试在本地工作(Windows)但不在 Jenkins(Linux)中

Springboot使用junit

第二章-spring boot springDataJPA快速开发DAO层,junit测试

使用 JUnit 5 的 spring-boot-starter-test