33

テストコードのスニペットを想定しましょう。

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

7 に答える 7

21

これはトリックを行います(シンプルで明確):

try {
 verify(myMockedObject, times(1)).doSomthing();
} catch (MockitoAssertionError error) {
    throw new MockitoAssertionError("Was expecting a call to myMockedObject.doSomthing but got ", error);
}
于 2012-07-02T04:12:22.980 に答える
6

あなたはmockitoではできません。Mockito 構文を使用すると、予想される動作を非常に簡単にテストできますが、テスト状態の概念はありません。

あなたがやろうとしているのは、モックが期待に失敗したときに、モックされたオブジェクトにない情報を持つことです。

本当にやりたい場合は、2 つの一般的な方法があります。インターフェイスを実装する独自の validationMode を作成するかのいずれかです。

org.mockito.verification;
public static interface VerificationMode

失敗した場合、またはモデル内の現在テストされているメソッドをビューオブジェクトに追加した場合にメッセージを表示する atLeastOnceMsd(String msg) のようなメソッドを追加します

たとえば、内側のループに同様の行があります。

  view.setName("now we are testing " + method.getName());
于 2010-11-27T12:13:02.820 に答える
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());
}
于 2010-11-15T16:02:12.640 に答える
1

現在のメソッドに関する情報を出力するマッチャーを作成できます。少しぎこちなくなりますが、検証が失敗したときにメソッド名を出力できます。

于 2010-11-26T22:06:11.867 に答える
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();
于 2021-04-06T16:19:20.803 に答える
1

org.mockito.internal.verification.Descriptionprovided にデリゲートするものがありVerificationModeますが、検証メッセージをオーバーライドできます。

于 2019-09-20T14:18:42.860 に答える