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)中