我正在我的 Spring Boot 应用程序中进行集成测试。该应用程序需要一个 Redis 才能使用。
在开发阶段,我有一个应用程序连接到的 Redis 本地容器。
对于集成测试,我使用的是testcontainers,并且我还按照他们的示例说明了如何使用 Redis 容器。
在某些时候,我明白只有在开发容器启动并运行时测试才能正确运行。如果它关闭,则集成测试正在下降,因为它们无法到达 Redis。
所以集成测试类看起来像这样:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = SharkApplication.class,
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@TestPropertySource(locations = "classpath:application-integrationtests.yml")
@AutoConfigureMockMvc
public class SharkIntegrationTest {
static GenericContainer redis = new GenericContainer("redis:3.0.6")
.withExposedPorts(6379);
@BeforeClass
public static void before(){
redis.start();
}
@AfterClass
public static void after(){
redis.stop();
}
...
运行测试时,我可以在日志中看到:
14:36:24.372 [main] DEBUG [redis:3.0.6] - Starting container: redis:3.0.6
14:36:24.372 [main] DEBUG [redis:3.0.6] - Trying to start container:
redis:3.0.6
14:36:24.373 [main] DEBUG [redis:3.0.6] - Trying to start container:
redis:3.0.6 (attempt 1/1)
14:36:24.373 [main] DEBUG [redis:3.0.6] - Starting container: redis:3.0.6
14:36:24.373 [main] INFO [redis:3.0.6] - Creating container for image:
redis:3.0.6
...
14:36:25.282 [main] INFO [redis:3.0.6] - Container redis:3.0.6 started
但随后应用程序失败,因为它无法访问 Redis:
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: Connection refused: connect
在某些时候,我尝试更改容器应该启动的端口。从 6379 到 16379(在代码和 yml 文件中都进行了更改),但随后测试进入了无限循环并打印到屏幕:
14:41:57.258 [ducttape-0] DEBUG org.testcontainers.containers.ExecInContainerPattern - /amazing_beaver: Running "exec" command: /bin/bash -c </dev/tcp/localhost/16379 && echo