【问题标题】:JUnit parametrized test with parametrized Spring ApplicationContext configuration带有参数化 Spring Application Context 配置的 JUnit 参数化测试
【发布时间】:2021-01-30 05:07:23
【问题描述】:

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 kotlin spring-test junit-jupiter parametrized-testing


    【解决方案1】:

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

    相关问题:

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

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

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

    【讨论】:

    • 哇,我没想到会有这么具体的答案,所以我看了你的个人资料,然后......谢谢,我的苏黎世邻居 :)
    猜你喜欢
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多