是否可以在 WebMvcTest 中激活弹簧配置文件

Posted

技术标签:

【中文标题】是否可以在 WebMvcTest 中激活弹簧配置文件【英文标题】:Is it possible to activate a spring profile in a WebMvcTest 【发布时间】:2019-03-21 12:54:53 【问题描述】:

给定一个测试类,例如:

@WebMvcTest
@RunWith(SpringRunner.class)
@SpringBootTest(properties = "spring.profiles.active=test")
public class MyControllerTest  
... some tests

我得到错误:

java.lang.IllegalStateException:配置错误:发现测试类 [com.example.MyControllerTest] 的多个 @BootstrapWith 声明:[@org.springframework.test.context.BootstrapWith(value=class org.springframework.boot. test.autoconfigure.web.servlet.WebMvcTestContextBootstrapper), @org.springframework.test.context.BootstrapWith(value=class org.springframework.boot.test.context.SpringBootTestContextBootstrapper)]

期望的目标是我只是在运行一个控制器测试,因此出于测试性能的原因不想设置整个上下文 - 我只想要“Web 层”。

我可以删除 @SpringBootTest(properties = "spring.profiles.active=test") 行 - 但是,现在我还没有激活测试配置文件,它可以通过属性以某种方式自定义 Web 上下文,例如将不再应用的杰克逊自定义。有没有办法让“web 层”仅测试并仍然激活弹簧配置文件?

我的环境是javaversion "10.0.2" 2018-07-17,spring boot1.5.16.RELEASE

【问题讨论】:

如果您之前不知道,here 可能是几个选项 这是一篇很好的文章,展示了各种测试方法,但我没有看到任何与此相关的内容。 activate a spring profile 是什么意思。您要激活哪个弹簧配置文件? 自定义的。在这种情况下,它称为test。即类路径上有一个application-test.properties 文件。该文件可以执行诸如设置杰克逊序列化选项之类的操作,这些选项可以更改应用程序的行为。激活配置文件后,结果可能与未激活时不同,因此我想在测试中激活它。 【参考方案1】:

要设置活动配置文件,您可以使用@ActiveProfiles,像这样

@WebMvcTest
@RunWith(SpringRunner.class)
@ActiveProfiles("test")
public class MyControllerTest  

那么你可以application-test yml 或测试资源中的属性。

【讨论】:

如果您有一些基于配置文件的组件,则不会创建该组件。例如,我在 DEV 和测试配置文件中创建了一个组件,当我使用 @WebMvcTest 和 @ActiveProfiles("test") 运行 ControllerTest 时,applicationContext 不会创建该组件。【参考方案2】:

此外,如果您以这样的程序化方式获得活跃的个人资料:

String environment = System.getProperty("spring.profiles.active");

然后你可以在你的测试类的静态块中设置这个属性:

@WebMvcTest
public class MyControllerTest  
    static 
        System.setProperty("spring.profiles.active", "foo");
    


【讨论】:

以上是关于是否可以在 WebMvcTest 中激活弹簧配置文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在Web应用程序中正确激活弹簧轮廓

如何强制弹簧只有一个活动配置文件?

在 Spring Boot 中禁用 @WebMvcTest 的 Spring Security 配置类

提供配置弹簧安全的方法?

如何使用@WebMvcTest 春季测试在模拟服务中注入模拟的restTemplate

如何检查所有弹簧占位符是不是存在?