我应该在测试期间模拟 Spring Cloud Config 服务器属性吗?

Should I mock Spring Cloud Config server properties during tests?

如何测试将 spring 云配置服务器的属性作为依赖项注入其中的服务?

  1. -我是否在测试期间使用 new 关键字简单地创建自己的属性?(new ExampleProperties())
  2. 或者我是否必须使用 spring 并创建某种测试属性并使用配置文件来判断要使用哪些属性?
  3. 或者我应该让 spring 在测试期间调用 spring 云配置服务器吗?

我的服务如下所示:

@Service
class Testing {

    private final ExampleProperties exampleProperties

    Testing(ExampleProperties exampleProperties) {
        this.exampleProperties = exampleProperties
    }

    String methodIWantToTest() {
        return exampleProperties.test.greeting + ' bla!'
    }
}

我的项目在启动期间调用 spring 云配置服务器以获取属性,这是通过在 bootstrap.properties 上设置以下内容启用的:

spring.cloud.config.uri=http://12.345.67.89:8888

我的配置如下所示:

@Component
@ConfigurationProperties
class ExampleProperties {

    private String foo
    private int bar
    private final Test test = new Test()

    //getters and setters

    static class Test {

        private String greeting

        //getters and setters
    }
}

属性文件如下所示:

foo=hello
bar=15

test.greeting=Hello world!

对于单元测试,只需简单地模拟属性并使用 Mockito 方法 when(mockedProperties.getProperty(eq("propertyName")).thenReturn("mockPropertyValue") 就可以了。

对于集成测试,所有 Spring 上下文都应该被初始化并作为常规应用程序工作,在这种情况下,您不需要模拟您的属性。

您可以在测试期间使用 @TestPropertySource annotation 伪造属性:

@ContextConfiguration
@TestPropertySource(properties = { "timezone = GMT", "port: 4242" })
public class MyIntegrationTests {
    // class body...
}

另一种选择是使用 SpringBootTest 注解的 properties 属性:

@SpringBootTest(properties = {"timezone=GMT", "port=4242"})