【问题标题】:JUnit 4.11 -> 4.12 introduced @Rule bug, doesn't executing testsJUnit 4.11 -> 4.12 引入了@Rule 错误,不执行测试
【发布时间】:2019-01-08 14:48:00
【问题描述】:

我从 JUnit 4.11 切换到 4.12。现在我在@Rule 带注释的方法执行中有一个错误。我的规则方法如下所示:

@Rule
public WireMockRule testServer() {
    // ... other stuff gets created ...
    return new WireMockRule(
            wireMockConfig().extensions(...parameterized-extensions...).port(PORT), true);
}

现在,启动后,规则方法被执行(正常),没有开始测试(不好),但testServer() 方法立即被执行再次 , 没有完成第一个。所以测试失败了,因为端口已经绑定并且仍然绑定。

在 4.11 中没有问题。没有配置设置来并行运行我的测试。我应该提到我的测试类是用@RunWith(Parameterized.class) 参数化的,但是在 4.11 中按顺序执行。

【问题讨论】:

  • 不应该是@ClassRule 上的static 方法吗?
  • @M.Deinum 否,因为扩展是参数化的。
  • @Jan:您的testServer() 函数实际上是在启动测试夹具吗?这似乎是错误的。 TestRule 实现在构造时不应该做任何工作,它应该只是装饰测试语句以添加设置和拆除行为。我怀疑你的WireMockRule 启动服务器太早了。
  • @DanielPryden 主要测试夹具在@BeforeClass setUp() 中创建,启动服务器,部署所有耳朵,启动消息队列等。WireMockRule 而是捕获生成的 REST 消息并检查它们如果它们符合预期数据,则对应于当前测试的参数。
  • @Jan:好的,但听起来你在抱怨 WireMockRule 在装饰语句时被实例化了多次。这不应该是一个问题,除非 WireMockRule 在实例化时正在工作。相反,它应该推迟工作,直到语句(如果有)被执行。

标签: java junit4


【解决方案1】:

我找到了错误的原因并进行了简单的修复。刚刚下载了WireMockRule的源代码并调试它。 事实证明,在 JUnit 4.11 中,在规则获取 apply(...) 调用以运行测试之前,每个参数都会调用 testServer() 方法一次,而在 4.12 中,它总是被调用 两次 em> 在规则获取 apply(...) 调用以运行测试之前。 所以解决方案很简单:

private WireMockRule testServer;

@Rule
public WireMockRule testServer() {
    if (testServer != null) {
        return testServer;
    }
    // ... other stuff gets created ...
    testServer = new WireMockRule(
        wireMockConfig().extensions(...parameterized-extensions...).port(PORT), true);
    return testServer;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    • 2014-04-07
    • 1970-01-01
    相关资源
    最近更新 更多