在单元/集成测试阶段

时间:2018-06-17 06:37:23

标签: java unit-testing spring-boot integration-testing

使用Spring Boot和Testcontainers我需要一种动态告诉应用程序测试容器正在侦听的端口的方法。

我知道在测试期间我可以告诉Spring使用不同的属性文件:

@TestPropertySource(locations = "classpath:application-integrationtests.yml")

但是由于端口是随机的,我需要以编程方式将值注入Spring或属性文件。

我不是在讨论@Value参数,因为它会从属性文件中向bean注入一个值,因为当应用程序处于测试阶段时,无法知道此值将是什么是

3 个答案:

答案 0 :(得分:0)

可能有更好的方法,但我刚刚使用系统属性。

@SpringBootTest
@DirtiesContext
public class MyTest {
    @BeforeClass
    public static void setUpEnvironment() {
        System.setProperty("kafka.bootstrap.servers", testKafka.getServers(); 
    }
    ...
}

答案 1 :(得分:0)

很难写出正确的答案,因为您没有显示使用Testcontainers的代码。但是from the documentation

  

类规则提供了发现测试如何与容器交互的方法:

     

String redisUrl = redis.getContainerIpAddress() + ":" + redis.getMappedPort(6379);返回容器正在侦听的IP地址       {{1}}返回已在容器上公开的端口的Docker映射端口

     

例如,使用上面的Redis示例,以下内容将允许您的测试访问Redis服务:

     

{{1}}

因此,您应该能够轻松访问此信息。

答案 2 :(得分:0)

关注@Dirk Deyne与an example from testcontainers demo的良好链接我在这里添加了Testcontainer对上述问题的解决方案的副本(经过少量修改):

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = DemoApplication.class,webEnvironment = 
                           WebEnvironment.RANDOM_PORT)
@ContextConfiguration(initializers = MyIntegrationTest.Initializer.class)
public class MyIntegrationTest {

public static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
    @Override
    public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
        TestPropertyValues values = TestPropertyValues.of(
                "some.value.1=" + someObject.getSomeValue(),
                "some.value.2=" + someObject.getOtherValue()
        );
        values.applyTo(configurableApplicationContext);
    }
  }
}