使用 Micronaut 应用程序为 JUnit5 中的每个单元/集成测试运行一次 TestContainer

Posted

技术标签:

【中文标题】使用 Micronaut 应用程序为 JUnit5 中的每个单元/集成测试运行一次 TestContainer【英文标题】:Running TestContainer once for each Unit/Integration test in JUnit5 with Micronaut application 【发布时间】:2021-10-17 07:33:55 【问题描述】:

我在 Micronaut 应用程序中使用带有 JUnit 5 的测试容器。我有很多集成测试,我想为每个集成测试创建并运行一次测试容器。

**对不同文件的第一次测试**

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@MicronautTest
public class DiscountGetListenerTest extends TestContainerFixture 
    @Inject
    static IDiscountProducer iDiscountProducer;
    
    @Test
    @DisplayName("Should return the discount based on the specified id")
    void shouldReturnTheDiscountBasedOnTheSpecifiedId() 
    

对不同文件的第二次测试

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@MicronautTest
public class DiscountListenerTest extends TestContainerFixture 
    @Inject
    IDiscountProducer iDiscountProducer;

    @Test
    @DisplayName("Should return discounts list")
    void shouldReturnDiscountsList() 
        var item = iDiscountProducer.Find(new DiscountCriteriaCommand(null)).blockingGet();
        assertTrue(item.size() == 0);
    

测试容器夹具

@Testcontainers
public class TestContainerFixture 
    @Container
    public GenericContainer mongoDBContainer = new GenericContainer(DockerImageName.parse("mongo:4.0.10"))
            .withExposedPorts(27017);
    @Container
    public GenericContainer rabbitMQContainer = new GenericContainer(DockerImageName.parse("rabbitmq:3-management-alpine"))
            .withExposedPorts(5672);

当我在每个集成测试上运行应用程序时,容器被创建并启动,但是,我想创建一次并启动容器一次

例如

在每个测试用例中,都会创建并启动容器...如何创建并启动容器一次??

【问题讨论】:

【参考方案1】:

也许你可以尝试这里解释的单例容器模式:https://www.testcontainers.org/test_framework_integration/manual_lifecycle_control/

所以对于你的代码:

public abstract class TestContainerFixture 
    public static final GenericContainer mongoDBContainer;
    public static final GenericContainer rabbitMQContainer;
    
    static 
       mongoDBContainer = new GenericContainer(DockerImageName.parse("mongo:4.0.10"))
            .withExposedPorts(27017);
       rabbitMQContainer = new GenericContainer(DockerImageName.parse("rabbitmq:3-management-alpine"))
            .withExposedPorts(5672); 
       mongoDbContainer.start();
       rabbitMQContainer.start();



当你在测试中扩展这个抽象类时,也许这会起作用。

【讨论】:

以上是关于使用 Micronaut 应用程序为 JUnit5 中的每个单元/集成测试运行一次 TestContainer的主要内容,如果未能解决你的问题,请参考以下文章

处理 bean 注册时出错 [io.micronaut.rabbitmq.intercept.RabbitMQConsumerAdvice]

使用 Micronaut 为 MongoDB 注册编解码器

为 mongodb 的 micronaut 设置测试容器

在 Jetty 未按预期工作的情况下在 micronaut 上启用 HTTPS 支持

Micronaut 数据:没有为存储库配置支持 RepositoryOperations

如何像 Spring Boot 方式一样为 Micronaut (1.1.4) HTTP 客户端配置 HTTP 代理?