从Spring引导单元测试中排除Spring Cloud Config Server

时间:2017-09-11 17:54:57

标签: java spring unit-testing spring-boot

鉴于我有以下3豆:

@Component
public class ServiceConfig {
    // This value is only available from the Spring Cloud Config Server
    @Value("${example.property}")
    private String exampleProperty;

    public String getExampleProperty() {
        return exampleProperty;
    }
}

@Component
public class S1 {
    int i = 1;
}

@Component
public class S2 {

    @Autowired
    S1 s1;

}

我希望能够运行以下测试:

@RunWith(SpringRunner.class)
@SpringBootTest
public class S2Test {

    @Autowired
    S2 s;

    @Test
    public void t2() {
        System.out.println(s.s1.i);
    }

}

我遇到的问题是,因为我想隔离测试S2类,因为它使用@Autowired我必须在测试中使用Spring上下文,但是当Spring上下文启动时它尝试创建包含带@Value的bean的所有3个bean。由于此值仅可从Spring Cloud Config Server获得,因此将无法创建上下文,并显示错误:org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'serviceConfig': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'example.property' in string value "${example.property}"

  

我的问题是:如何从Spring Cloud Config中读取属性   运行单元测试时在应用程序中处理服务器,观察   我的测试我甚至不关心配置所以我不想明确   我必须在我的测试中设置一个值才能启动上下文?

2 个答案:

答案 0 :(得分:7)

我建议只需添加" spring.cloud.config.enabled"在" src / test / resources / application.properties"中为false并为" example.property" ..

添加测试值
spring.cloud.config.enabled=false
example.property=testvalue

这很简单,不会影响您的代码库。 如果需要,您还可以使用MOCK Web环境,以及不包含这些bean的自定义测试应用程序配置。

@SpringBootTest(classes = TestOnlyApplication.class, webEnvironment = SpringBootTest.WebEnvironment.MOCK)

答案 1 :(得分:3)

有一些选择。

  1. 您可以创建测试配置文件。然后,您需要创建#!/bin/bash -e # Not giving the IP here but I guess you can understand HOST = Some IP address of EC2 instance in AWS # Current Project workspace # Download source code and create a tar and then SCP it in to AWS EC2 # So my Code is copied in to AWS EC2 instance now ... # Now do the SSH and run the script on AWS EC2 instance ssh -o StrictHostKeyChecking=no -i MySecrets.pem ec2-user@$HOST \ "tar xvf pc.tar && \ cd my_project_source_code && \ docker stop $(docker ps -a -q) && \ docker rmi $(docker images -a -q) && \ sh -c 'nohup docker-compose kill > /dev/null 2>&1 &' && \ docker-compose build --no-cache && \ sh -c 'nohup docker-compose up > /dev/null 2>&1 &' " application-test.yml文件。在那里,您可以为application-test.properties设置相同的值。在那里,如果您想使用example.property配置文件开始一些测试,则可以添加到测试类test注释中。对于这些测试,@ActiveProfiles("test")将启动。

  2. 您可以输入test来设置example.property的默认值。如果找不到属性,将插入@Value("${example.property:SomeDefaultValue}")

  3. 我建议采用第一种方法。您可以使用注释设置正确的配置文件,并确保将配置服务器发送给您。