【发布时间】:2015-04-30 09:36:19
【问题描述】:
是否有任何 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 的运行时(而不是在 junit 测试的运行时)执行,如果 myMethod 将使用预期的值/参数调用。 为了断言该方法被调用,我必须另外定义一个验证(否则即使没有调用该方法,我的测试仍然会运行)。
verify(x).myMethod(xxx);
如果我有机会在 answer 方法中写出像 assertFailIfThisLineIsNotExecuted 这样的东西,我就不必定义额外的验证。再说一遍,是否有任何 junit 断言,我可以用它强制执行一行?可以说与fail()相反,没有立即将方法定义为“成功”。
【问题讨论】:
-
验证
answer的处理结果就知道了。为什么你不能测试它的行为? -
myMethod 是无效的,这里多用 doAnswer..
-
你不应该模拟你正在测试的单元。如果您正在测试是否在特定情况下调用 myMethod(这就是您所说的“assertIfThisLineIsNotExecuted”,那么您实际上是在测试您的模拟行为
-
换句话说,至少在 IMO,你不应该在
doAnswer中包含assert* -
在某些情况下,它使 %100 有意义。应该这样做。例如:akcasoy.wordpress.com/2015/04/09/the-power-of-thenanswer 用例 2
标签: java unit-testing junit mockito