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

时间:2017-06-09 08:58:27

标签: java unit-testing spring-boot groovy spring-cloud-config

如何测试具有spring cloud config server属性的服务作为依赖项注入其中?

  1. - 我是否只是在测试期间使用new关键字创建自己的属性?(new ExampleProperties())
  2. 或者我是否必须使用spring并创建某种测试属性并使用配置文件来判断要使用哪些属性?
  3. 或者我应该让Spring在测试期间调用spring cloud配置服务器?
  4. 我的服务如下所示:

    @Service
    class Testing {
    
        private final ExampleProperties exampleProperties
    
        Testing(ExampleProperties exampleProperties) {
            this.exampleProperties = exampleProperties
        }
    
        String methodIWantToTest() {
            return exampleProperties.test.greeting + ' bla!'
        }
    }
    

    我的项目在启动期间调用spring cloud配置服务器以获取属性,通过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!
    

3 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:2)

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

对于集成测试,所有Spring上下文都应该被用作常规app,在这种情况下你不需要模拟你的属性。

答案 2 :(得分:2)

另一个选择是使用SpringBootTest注释的属性属性:

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