尝试将 Testcontainers 规则与抽象类中的网络一起使用时出现“没有这样的网络”错误

Posted

技术标签:

【中文标题】尝试将 Testcontainers 规则与抽象类中的网络一起使用时出现“没有这样的网络”错误【英文标题】:"No such network" error when trying to re-use Testcontainers rules with network from abstract class 【发布时间】:2018-03-15 17:35:30 【问题描述】:

假设我有一个名为 AbstractTestWithNetwork 的抽象类:

@RunWith(JUnit4.class)
public abstract class AbstractTestWithNetwork 

    @ClassRule
    public static Network network = Network.newNetwork();

    @ClassRule
    public static GenericContainer etcd = new GenericContainer<>("alpine:3.6")
            .withNetwork(network);

我想通过扩展它来简单地重新使用它以在多个类中拥有相同的容器:

public class FirstTestClass extends AbstractTestWithNetwork 
    @Test
    public void emptyMethod() throws Exception 
        System.out.println("An empty test method");
    

还有一个SecondTestClass,内容相同。

我可以从 IDE 单独运行每个类,它们会通过。但是当我运行gradle test 或从IDE 中选择带有测试类的整个包时,只有第一个测试类通过。第二个我得到:

org.testcontainers.containers.ContainerLaunchException: Container startup failed
Caused by:
org.rnorth.ducttape.RetryCountExceededException: Retry limit hit with exception
Caused by:
org.testcontainers.containers.ContainerLaunchException: Could not create/start container
Caused by:
java.lang.reflect.UndeclaredThrowableException
Caused by:
java.lang.reflect.InvocationTargetException
Caused by:com.github.dockerjava.api.exception.NotFoundException: "message":"No such network: a48cf082ab42a55c843e9963c3938f44dd93cceae09e1724d4fefd5b45f235f1"

【问题讨论】:

【参考方案1】:

我检查了实现并发现了a bug in Networks' implementation。

在 TestContainers

但我要告诉你一个好消息 - 在修复之前有一个简单的解决方法:只需从“网络”字段中删除 @ClassRule。

【讨论】:

以上是关于尝试将 Testcontainers 规则与抽象类中的网络一起使用时出现“没有这样的网络”错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JUnit 5 在 Kotlin 中创建 TestContainers 基测试类

如何关闭关闭 TestContainers 中的容器?

无法连接到 SpringTest 中由 TestContainers 创建的容器

如何将 Testcontainers 与 @DataJpaTest 结合使用以避免代码重复?

抽象类与接口

Spring Boot TestContainers 映射的端口只能在容器启动后获取