代码之家  ›  专栏  ›  技术社区  ›  Boris Pavlović

在Mockito的verify方法中是否有类似jUnit Assert消息参数的方法?

  •  21
  • Boris Pavlović  · 技术社区  · 14 年前

    假设有一段测试代码:

    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()
    );
    

    解决方案:

    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());
    
    4 回复  |  直到 13 年前
        1
  •  2
  •   Joe Coder    5 年前

    这个问题很古老,但是Mockito v2.1.0+现在有了一个内置的特性。

    verify(mock, description("This will print on failure")).someMethod("some arg");
    
        2
  •  19
  •   tasomaniac    5 年前

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

    try {
     verify(myMockedObject, times(1)).doSomthing();
    } catch (MockitoAssertionError error) {
        throw new MockitoAssertionError("Was expecting a call to myMockedObject.doSomthing but got ", error);
    }
    
        3
  •  6
  •   Uberto    13 年前

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

    您要做的是在模拟没有达到预期时,获得一些不在模拟对象中的信息。

    如果你真的想这么做,我认为有两种方法: 或者创建自己的verificationMode来实现接口

    org.mockito.verification;
    public static interface VerificationMode
    

    并添加一个方法,如atLeastOnceMsd(String msg),该方法将在失败时显示消息,或者将模型中当前测试的方法添加到view对象

    例如,在内部循环中使用类似的行。

      view.setName("now we are testing " + method.getName());
    
        4
  •  3
  •   dom farr    14 年前

    没有直接的API调用允许在verify时发送消息。但我认为,如果您将验证签名更改为使用method对象而不是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());
    }
    
        5
  •  1
  •   iwein    13 年前

    您可以创建matcher来打印当前方法的信息。这会有点笨拙,但当验证失败时,打印方法名是可行的。

        6
  •  1
  •   Konstantin Berkov    5 年前

    org.mockito.internal.verification.Description 哪些代表提供 VerificationMode ,但允许重写验证消息。