有没有办法在Mockito的验证方法中使用类似jUnit Assert的消息参数?

时间:2010-11-15 14:29:57

标签: java junit assert mockito verify

让我们假设一段测试代码:

Observable model = Class.forName(fullyQualifiedMethodName).newInstance();
Observer view = Mockito.mock(Observer.class);
model.addObserver(view);
for (Method method : Class.forName(fullyQualifiedMethodName).getDeclaredMethods())
{
  method.invoke(model, composeParams(method));
  model.notifyObservers();
  Mockito.verify(
    view, Mockito.atLeastOnce()
  ).update(Mockito.<Observable>any(), Mockito.<Object>any());
}
如果模型中的方法未调用Mockito.verify方法,则

Observable.setChanged()方法会抛出异常。

问题:没有添加loggers/System.print.out我无法意识到当前的测试失败的方法是什么。有没有办法与jUnit Assert方法类似:

Assert.assertEquals(
  String.format("instances %s, %s should be equal", inst1, inst2),
  inst1.getParam(), 
  inst2.getParam()
);

SOLUTION:

verify(observer, new VerificationMode()
{
  @Override
  public void verify(VerificationData data)
  {
    assertTrue(
        format(
            "method %s doesn't call Observable#setChanged() after changing the state of the model",
            method.toString()
        ),
        data.getAllInvocations().size() > 0);
  }
}).update(Mockito.<Observable>any(), Mockito.<Object>any());

7 个答案:

答案 0 :(得分:18)

这就是诀窍(简单明了):

try {
 verify(myMockedObject, times(1)).doSomthing();
} catch (MockitoAssertionError e) {
    throw new MockitoAssertionError("Was expecting a call to myMockedObject.doSomthing but got "+ e.getMessage());
}

答案 1 :(得分:6)

你不能在mockito做。 Mockito语法很容易测试预期的行为,但它没有测试状态的概念。

你要做的是当模拟失败时,获得一些不在模拟对象中的信息。

如果你真的想这样做,我会看到两种一般方式: 要么创建自己的验证模式,要么实现接口

org.mockito.verification;
public static interface VerificationMode

并添加一个类似于atLeastOnceMsd(String msg)的方法,该方法将在模型失败或将当前测试的方法添加到视图对象时显示消息

例如在内循环中有类似的行。

  view.setName("now we are testing " + method.getName());

答案 2 :(得分:3)

没有直接的API调用允许验证消息。但我认为如果你改变你的验证签名以使用方法对象而不是Mockito.any(),那么Method类上的toString()将会启动并为你提供你想要的东西。

像这样。

import static org.mockito.Matchers.anyObject;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.verify;
import static org.mockito.Matchers.eq;

...

Observable model = Class.forName("class name").newInstance();

verify(view, times(1)).update(eq(model), anyObject());

for (Method method : Class.forName("class name").getDeclaredMethods())
{
    method.invoke(model, composeParams(method));
    model.notifyObservers();
    verify(view, atLeastOnce()).update(eq(method), anyObject());
}

答案 3 :(得分:2)

这个问题很古老,但是Mockito v2.1.0 +现在具有内置功能。<​​/ p>

verify(mock, description("This will print on failure")).someMethod("some arg");

答案 4 :(得分:1)

您可以创建匹配器以打印当前方法的信息。它会有点笨拙,但是当验证失败时它会打印方法名称。

答案 5 :(得分:1)

org.mockito.internal.verification.Description代表提供了VerificationMode,但允许覆盖验证消息。

答案 6 :(得分:1)

您可以使用 https://www.javadoc.io/doc/org.mockito/mockito-core/2.2.6/org/mockito/verification/VerificationMode.html#description(java.lang.String)
例如。

verify(mocked,times(1).description("This method is expected to invoke once")).someMethod();