如何在JUnit4中看到assumeThat
的错误消息?
此测试通过但不打印任何内容。原因是要在read1
上执行测试,我需要b
为true
。由于b
为false
,因此测试不适用。
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。
答案 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;
}
}