spring - 使用参数化 Spring 应用程序上下文配置进行 JUnit 参数化测试

标签 spring kotlin spring-test junit-jupiter parametrized-testing

SpringBoot 2.2.11、JUnit 5。
我的应用程序有多个环境。我有一个测试,测试这些环境中的某些条件,而不是应用程序本身。

因此,我想重用相同的测试方法,但根据环境变量/系统属性在不同的环境中运行它。

到目前为止,它是硬编码的:

@SpringBootTest(properties = ["app.env=test"])
class EnvTest {
    @Test fun test01() {...}
}

我想使用类似@ParameterizedTest的东西。

@SpringBootTest(properties = ["app.env=test"])
class EnvTest {
    @ParameterizedTest
    @ValueSource(strings = {"TEST", "PROD"})
    fun configCheck(env: String) {
        // Made-up for illustration
        spring.context.properties.put("app.env", env)
    }
}

但是,当上下文已经创建时,这些参数来得太晚了,并且测试上下文管理器无法考虑这些参数。我希望将参数应用于上下文创建。

到目前为止我能找到的所有to parametrize the context at runtime使我能够对 bean 进行参数化 - 即它适用于应用程序配置而不是测试配置,例如 @ContextConfiguration@ConfigurationProperties。当然,我也可以使用配置文件,并运行几次。但我更喜欢跑一次。

在我看来这是不可能的,因为我想要的是在方法级别,但上下文创建只能在类级别控制。因此,我可以将测试放在基类中,有多个子类,并根据运行时参数选择运行这些子类。但这并不像 @ParametrizedTest 那样优雅:)

SpringBoot 2.2.x 可以做到这一点吗?
也许可以以某种方式使用@ProfileValueSource

最佳答案

不,目前无法使用 Spring bean 定义配置文件参数化 JUnit Jupiter 测试(方法或类)。

相关问题:

  1. Spring :Introduce support for executing a test class with different sets of profiles
  2. Spring :Support @ContextConfiguration at method level
  3. Spring :Support @ActiveProfiles at method level
  4. JUnit Jupiter:Introduce extension API for container templates

理想情况下,JUnit Jupiter 将引入对容器模板的支持,此时 Spring 框架将能够在该支持之上构建,以便允许使用各种事件配置文件创建 ApplicationContext 以进行参数化测试类的调用。

在此期间,实现目标的最简单方法可能是定义一个具有通用 Spring 配置和通用测试方法的基测试类,然后为您希望测试的事件配置文件的每个组合引入一个子类。使用 @DirtiesContext 注释基测试类可能会很有用,因为为每个子类创建的上下文可能不会被多次使用。

关于spring - 使用参数化 Spring 应用程序上下文配置进行 JUnit 参数化测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65964835/

相关文章:

java - 如何在 I18n 中使用 Spring?

java - 如何使用 Spring JmsTemplate 更改 MQ header

android - 创建垂直分隔线 Jetpack Compose

kotlin - 检查TypeElement是否为注释处理器中的Kotlin数据类

email - 使用 Outlook smtp 服务器发送 ics 文件 RSVP 格式无法正常工作?

java - 使用 MockBean 清理 Spring Context 缓存失败 loadLibrary

java - Spring @PropertySource,如何读取不在类路径上,而是在WEB-INF下的文件

java - 如何找到 Hibernate + Spring-JPA 的兼容版本对? (无法打开 JPA EntityManager 进行交易)

java - SpringJUnit4ClassRunner - 静态访问EntityManager(Factory)

java - 如何正确使用spring boot测试?