使用Spring Boot和Testcontainers我需要一种动态告诉应用程序测试容器正在侦听的端口的方法。
我知道在测试期间我可以告诉Spring使用不同的属性文件:
@TestPropertySource(locations = "classpath:application-integrationtests.yml")
但是由于端口是随机的,我需要以编程方式将值注入Spring或属性文件。
我不是在讨论@Value
参数,因为它会从属性文件中向bean注入一个值,因为当应用程序处于测试阶段时,无法知道此值将是什么是
答案 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);
}
}
}