gpt4 book ai didi

java - SpringBootTest - 如何在测试级别断言上下文不加载和更改属性?

转载 作者:行者123 更新时间:2023-12-04 12:41:56 33 4
gpt4 key购买 nike

我靠@SpringBootTest在测试应用程序配置时非常重要。应用程序属性可能很复杂,具有默认值和重要的验证。例如:

prop:
ports: 1205,2303,4039
fqdn: ${server.host}:${ports[0]}/${path}

@Configuration
SomeConfigClass{
@Value{"${ports}:{#collections.emptyList}"}
List<Integer> ports;

...
}

在测试此类应用程序时,我会在没有模拟的情况下提供完整或部分的应用程序上下文,因为上下文和验证本身存在复杂性 - 模拟不会捕获这一点。不幸的是,我一直发现这种模式有两个限制:
  • 我们如何测试错误的配置无法加载?

    想象一下测试该端口无效,因为它不在500 - 1500 的限制范围内。 .
    @SpringBootTest(
    classes = {SomeConfigClass.class},
    properties = "port=9000"
    )
    public class BadConfigTest{

    @Test(expected = ApplicationContextFailedException.class)
    public void WHEN_port_9000_THEN_appcontext_fails_to_load() {}

    }

    由于测试框架在应用程序上下文之后加载,因此似乎无法测试应用程序上下文加载失败。现在我实际编写测试,手动确认它们失败,然后使用 @Ignored 进行注释。所以他们不会丢失。
  • 如何在测试方法而不是类级别更改属性?
    @SpringBootTest是一个类注释,意味着应用程序属性在测试类级别绑定(bind)。这导致许多属性集需要一个测试类,并使测试套件膨胀。例如,我最终会得到如下测试类:
    ConfigPropertiesAllValidTest
    ConfigPropertiesNoneSetTest
    ConfigPropertiesSomeValidSomeNotTest

    其中每个只有一个或两个测试用例。最好有一个 ConfigPropertiesTest为每个测试提供不同 Prop 的类(class)。这可能吗?

  • 再次 - 我想避免模拟,因为它们不会捕获 Spring 在运行时执行的非平凡上下文自动配置。

    最佳答案

    关于java - SpringBootTest - 如何在测试级别断言上下文不加载和更改属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54279413/

    33 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com