我正在尝试为连接到沙发床的Spring Boot应用程序设置自动化集成测试。我想使用随机可用端口针对新的容器化数据库进行测试,这样我们就不必担心开发人员机器上或持续集成环境中的端口冲突。
到目前为止,我已经创建了一个测试,该测试使用com.palantir.docker.compose.DockerComposeRule
启动couchbase docker image,以在随机可用端口上公开标准端口。但是,org.springframework.boot.autoconfigure.couchbase.CouchbaseProperties不会公开端口的任何属性。
我可以看到org.springframework.data.couchbase.config.CouchbaseEnvironmentParser暗示有某种方法可以设置端口。我还无法弄清楚如何使用它。其他人能做到这一点吗?
这是到目前为止我的测试结果:
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
@Category(IntegrationTest.class)
public class BiscuitRepositoryIT {
private static final int COUCHBASE_PORT = 8091;
private static final String COUCHBASE_SERVICE = "couchbase";
@ClassRule
public static DockerComposeRule docker = DockerComposeRule.builder()
.file("src/test/resources/docker-compose-couchbase.yml")
.projectName(ProjectName.random())
.waitingForService(COUCHBASE_SERVICE, HealthChecks.toHaveAllPortsOpen())
.build();
@Autowired
private BiscuitRepositoryConfig config;
@Autowired
private BiscuitRepository biscuitRepository;
@BeforeClass
public static void initialize() {
DockerPort couchbase = docker.containers()
.container(COUCHBASE_SERVICE)
.port(COUCHBASE_PORT);
log.info("couchbase ports: {}", couchbase);
// TODO update integration-test properties file with the ports
// before the spring context starts.
}
@After
public void tearDown() throws Exception {
biscuitRepository.deleteAll();
}
@Test
public void insertBiscuit() throws Exception {
Biscuit digestive = Biscuit.builder().name("digestive").manufacturer("biscuitCorp").build();
Biscuit persistedBiscuit = biscuitRepository.save(digestive);
assertThat(persistedBiscuit).isEqualToIgnoringGivenFields(digestive, "id", "version");
}
}