【问题标题】:How GenericContainer from test containers should be parametrised?测试容器中的 GenericContainer 应该如何参数化?
【发布时间】:2019-11-25 07:23:54
【问题描述】:

我的 IDE 中出现以下错误:

参数化类“GenericContainer”检查信息的原始使用: 报告类型参数的参数化类的任何使用 被省略。参数化类型的这种原始使用在 Java 中是有效的, 但破坏了使用类型参数的目的,并且可能掩盖错误。

我检查了文档,并且创作者也到处使用原始类型: https://www.testcontainers.org/quickstart/junit_4_quickstart/ f.e.:

@Rule
public GenericContainer redis = new GenericContainer<>("redis:5.0.3-alpine")
                                        .withExposedPorts(6379);

我不明白这种方法。谁能解释我应该如何参数化 GenericContainer?

【问题讨论】:

    标签: testcontainers


    【解决方案1】:

    Testcontainers 使用自键入机制:

    class GenericContainer<SELF extends GenericContainer<SELF>> implements Container<SELF> {
    ...
    }
    

    这是一个让流畅的方法工作的决定,即使类正在扩展:

    class GenericContainer<SELF extends GenericContainer<SELF>> implements Container<SELF> {
    
        public SELF withExposedPorts(Integer... ports) {
            this.setExposedPorts(newArrayList(ports));
            return self();
        }
    }
    

    现在,即使有子类,它也会返回最终类型,而不仅仅是GenericContainer

    class MyContainer extends GenericContainer< MyContainer> {
    }
    
    MyContainer container = new MyContainer()
            .withExposedPorts(12345); // <- without SELF, it would return "GenericContainer"
    

    仅供参考,Testcontainers 2.0 计划更改方法,您将在以下演示文稿中找到更多信息:
    https://speakerdeck.com/bsideup/geecon-2019-testcontainers-a-year-in-review?slide=74

    【讨论】:

    • 哦。现在我知道了。谢谢。 2.0版本好很多。让我们等等。
    • 事实上,你已经可以开始做 v2-like 了。幻灯片中的代码 sn-ps 应该适用于 1.x
    • 你能帮我使用 v2 之类的 api, fe: ` @ClassRule public static final PostgreSQLContainer userDbService = new PostgreSQLContainer().withExposedPorts( POSTGRESQL_PORT).withNetwork(network).withNetworkAliases("userDbService" );` 如何通过泛型类型将其键入保存?我收到错误Raw use of parameterized class 'PostgreSQLContainer'
    • 这不是错误,而是警告(可以被抑制)。 v2 将删除泛型类型,警告将消失。
    猜你喜欢
    • 2021-08-28
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    相关资源
    最近更新 更多