是否有任何junit断言,我可以强制执行一行?
例如:
doAnswer(new Answer<Void>() {
@SuppressWarnings("unchecked")
@Override
public Void answer(final InvocationOnMock invocation) throws Throwable {
Object[] arguments = invocation.getArguments();
Map<String, String> fieldMapActual = (Map<String, String>) arguments[0];
assertEquals(fieldMap, fieldMapActual);
**assertFailIfThisLineIsNotExecuted();**
return null;
}
}).when(x).myMethod(xxx);
当我模拟myMethod的行为时,如果myMethod将使用预期的值/参数调用,那么匿名内部类型的方法回答将在myMethod的运行时执行(而不是在junit test的运行时)。 为了断言调用该方法,我必须另外定义一个验证(否则即使没有调用该方法,我的测试仍然会运行)。
verify(x).myMethod(xxx);
如果我有机会在答案方法中写出 assertFailIfThisLineIsNotExecuted ,我就不必定义额外的验证。再说一次,是否有任何junit断言,我可以强制执行一行?相反,失败()可以说,没有立即将方法定义为&#34;成功&#34;。
答案 0 :(得分:1)
如果要确保正在执行测试的某一行,请使用布尔标志:
final boolean[] wasExecuted = { false };
...
wasExecuted[0] = true;
...
assertTrue("Some code wasn't executed", wasExecuted);
但我的直觉是,你正试图解决另一个问题。
verify
说“必须调用此方法”。你是否嘲笑答案并不重要。所以这是你应该使用的方法。
只有当我因某些原因无法创建模拟时,才会使用我的标记方法。如果发生这种情况,我会在测试代码中扩展测试中的类并添加标志。
标志优于verify
的优点是我期望代码所在的标志文档(您可以让IDE搜索所有使用该标志的位置)。 <{1}}在失败时并不容易找到。
verify()
应该是你想要的。它也表达了意图。
verify(x).myMethod(xxx);
也只是一行代码(那么它如何比assertFailIfThisLineIsNotExecuted()
“更好”?),JUnit不支持它,你必须编写代码来获得一个好的错误信息等。