JUnit4:假设该消息未打印

时间:2013-03-22 13:02:27

标签: junit4

如何在JUnit4中看到assumeThat的错误消息?

此测试通过但不打印任何内容。原因是要在read1上执行测试,我需要btrue。由于bfalse,因此测试不适用。

boolean b = false;
byte[] read1 = null;
assumeThat("b shold be true to continue testing", b, is(true));
assertThat("read1 should not be null", read1, is(notNullValue()));

我没有找到任何带有assumeThat消息的日志。我的问题是,我想知道哪些测试通过但没有完成,因为假设X失败了。如果仍然为假设打印了一条消息(例如类似于断言失败时),那将是很好的。

看起来很奇怪,我无法找到关于这个问题的评论(包括在JUnit页面中)。所以我有可能只是做错了什么或在错误的地方寻找消息。我正在使用Eclipe。

3 个答案:

答案 0 :(得分:0)

如果我理解正确,

assertThat("read1 should not be null", read1, is(notNullValue()));

只应在b == true时执行,但如果b == false则不是错误?

那你为什么不这么做呢:

if(b) {
    assertThat("read1 should not be null", read1, is(notNullValue()));
} else {
    log.warn("b == false, Test on read1 skipped");
}

?或者,如果发生这种情况,您是否希望获得特殊的测试结果状态(“成功但可疑”)?

更新:我刚刚重新阅读了Assume上的文档。它指出,如果一个假设失败,整个测试被认为是“没有意义”并被标记为“被忽略”。通过小型,专注的测试,通常可以为您提供所需的所有信息。

Update2:刚刚在Eclipse 4.2中使用JUnit 4.8进行了尝试。这只是标志着测试成功。所以我猜Eclipse中的JUnit运行器可能不能正确支持该功能。

答案 1 :(得分:0)

由于假设失败并非错误,因此不会打印错误。 assume方法用于短路由于值或状态一个或多个对象(或基元)而不应运行的测试。假设是为Theories运动员设计的,但它们也可用于其他跑步者。

假设的一个常见用法是,当您有多个测试方法需要执行某些操作以使对象进入特定状态,然后才能执行实际的测试用例逻辑。

在假设之前,每个测试都会使对象进入所需状态,断言它处于该状态,然后继续。例如,对于堆栈的测试,许多测试需要非空堆栈,因此您将创建堆栈,推送项目,断言堆栈不为空,然后执行其余测试(弹出项目,推送另一项,等等。)

如果您在多个测试中执行此模式,则会出现问题,然后会引入导致所有这些测试失败的错误(例如,isEmpty()始终返回true)。当你运行测试时,你会遇到很多失败,你不知道从哪里开始。

因此,您只有一个测试可以验证如果将项目推入空堆栈,isEmpy()将返回false。然后任何需要非空堆栈的测试都会这样做:

Stack<Object> stack = new Stack<>();
stack.push(new Object());
assumeFalse(stack.isEmpty());
// Continue with the test methods

如果您需要错误消息,可能需要使用断言。

答案 2 :(得分:0)

同意之前的回答(NamshubWriter) 但是,如果您真的希望(有理由)清楚地表明测试被忽略,因为某些假设失败了,您可以执行以下操作:

@Before
public void before() {
    final String mandatoryPropKey = "system.mandatory-property-for-this-test";
    final String mandatoryPropExpectedVal = "true";
    try { // try/catch because the Assume failure won't print any message (by design)
        Assume.assumeTrue("Assumed that the \"" + mandatoryPropKey + "\" system property is \"" + mandatoryPropExpectedVal + "\".", Boolean.valueOf(System.getProperty(mandatoryPropKey, mandatoryPropExpectedVal)));
    } catch (AssumptionViolatedException ave) {
        logger.warn("Not executing this test because this assumption failed: {}", ave.getMessage());
        throw ave;
    }
}