使用TestContainer将自定义容器用作数据库

时间:2019-08-29 15:18:50

标签: java spring-boot testcontainers

我正在尝试使用TestContainer进行Spring Boot应用程序的集成测试。

此类应用程序的数据库位于自定义PostgreSQL Docker映像中。

在集成测试中,ApplicationContext是通过MockMvc启动的,而容器是以类似的方式启动的

public class ITMyServiceTest {

  @Autowired
  private WebApplicationContext wac;

  private MockMvc mockMvc;

  @Rule
  public PostgreSQLContainer testPostgres = new PostgreSQLContainer("my-custom-database-image")
           .withDatabaseName("my_db")
           .withUsername("my_name")
           .withPassword("my_pwd");

  @Test
  public void shouldDoSomething() throws Exception {
    this.mockMvc.perform(get("/api/do/something")).andDo(print());
  }

现在发生的事情是容器已启动,但应用程序上下文未引用该容器。

我无法在spring.datasource.url=jdbc:tc:postgresql://localhost/my_db文件中使用JDBC URL方案(例如.properties),因为:

  • 如果我将postgresql指定为服务器,它将启动另一个服务器,上下文将使用它

  • 如果我指定容器的名称(或其他所有名称),则测试将正确地引发java.lang.IllegalArgumentException,因为它不是已知的数据库类型。

如何设置Spring的应用程序上下文以引用我的容器?

1 个答案:

答案 0 :(得分:0)

您可能拥有不同的application.properties(例如application-it.properties),并且在其中将集成测试特定的配置属性定义为-@TestPropertySource(locations = {"classpath:application-it.properties" },或者在集成测试期间处于活动状态的配置文件(例如-{{ 1}}

所以我想您想将应用程序的数据库端口设置为随机生成的数据库端口。如果是这种情况,那么可以先暴露端口:

@ActiveProfiles(AppConstants.INTEGRATIONTEST)

接着,当您设置spring.datasource.url时,您可以在其中设置来自postgresql容器的随机生成的端口(映射到暴露的端口),如何在应用程序属性内设置动态值显示在{ {3}}