Spring与Testcontainer的集成测试-应用程序后启动数据库

Spring与Testcontainer的集成测试-应用程序后启动数据库,spring,junit5,testcontainers,Spring,Junit5,Testcontainers,正在使用spring(core)测试的我的应用程序希望通过testcontainer连接到数据库,但testcontainer此时未启动。如何实现testcontainer准备就绪,然后启动整个上下文列表 import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import or

正在使用spring(core)测试的我的应用程序希望通过testcontainer连接到数据库,但testcontainer此时未启动。如何实现testcontainer准备就绪,然后启动整个上下文列表

 import org.junit.jupiter.api.Order;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.test.context.junit.jupiter.web.SpringJUnitWebConfig;
 import org.testcontainers.containers.PostgreSQLContainer;
 import org.testcontainers.junit.jupiter.Container;
 import org.testcontainers.junit.jupiter.Testcontainers;

@Testcontainers
@SpringJUnitWebConfig(locations = {"classpath:it-context.xml"})
public class IntegrationTest {


    @Container
    private PostgreSQLContainer postgresqlContainer = new PostgreSQLContainer();

    @Autowired
    private StatusBean status;

    @Test
    public void appStartedSuccessful(){
        // app & database successful started and connected
        System.out.println(postgresqlContainer.getJdbcUrl());
        System.out.println(postgresqlContainer.getTestQueryString());
        System.out.println(status.getStartupTimestamp());
    }

}

您可能需要等待容器启动并准备就绪

请看,虽然似乎指示容器应该等待一个神奇的日志条目,但由于某些原因,这可能不适用于您

如果您在测试方法中
Thread.sleep
,Pg容器是否最终如预期的那样到达?容器日志中指示某种故障的任何内容(不太可能,因为
static
技巧对您有效)


我在中没有看到任何指示在使用
@Container

时需要手动等待的内容。您可能希望等待容器启动并准备就绪

请看,虽然似乎指示容器应该等待一个神奇的日志条目,但由于某些原因,这可能不适用于您

如果您在测试方法中
Thread.sleep
,Pg容器是否最终如预期的那样到达?容器日志中指示某种故障的任何内容(不太可能,因为
static
技巧对您有效)


我在中没有看到任何指示在使用
@Container

时需要手动等待的内容。您是否意外地使用了JUnit4中的
@Test
?如果没有,能否添加测试和所有导入的完整堆栈跟踪?也许本指南也会有所帮助:唯一的解决方案是将容器设置为“final”和“static”,以便在测试开始之前创建一次数据库。@MemLeak谢谢您的评论!您是否偶然使用了JUnit4中的
@Test
?如果没有,能否添加测试和所有导入的完整堆栈跟踪?也许本指南也会有所帮助:唯一的解决方案是将容器设置为“final”和“static”,以便在测试开始之前创建一次数据库。@MemLeak谢谢您的评论!问题是spring上下文在测试容器之前就启动了,即使在等待的情况下也是如此。通过注释,magic spring将启动上下文,然后丢失数据库。啊,是的,我认为这听起来很熟悉。有人可能会争辩说,您的应用程序应该能够在短时间内处理丢失的db,也许是等到它准备好之后再开始启动。但是,您的解决方案现在可以正常工作了,这可能更重要。静态启动技术是由TestContainers记录的,尽管是在一个稍微复杂的机制中。问题是spring上下文是在测试容器之前启动的,即使是等待。通过注释,magic spring将启动上下文,然后丢失数据库。啊,是的,我认为这听起来很熟悉。有人可能会争辩说,您的应用程序应该能够在短时间内处理丢失的db,也许是等到它准备好之后再开始启动。但是,您的解决方案现在可以正常工作了,这可能更重要。TestContainers记录了这种静态启动技术,尽管其机制非常复杂。