310

これについてグーグルで検索しましたが、関連するものは見つかりませんでした。私はこのようなものを持っています:

Object obj = getObject();
Mockeable mock= Mockito.mock(Mockeable.class);
Mockito.when(mock.mymethod(obj )).thenReturn(null);

Testeable testableObj = new Testeable();
testableObj.setMockeable(mock);
command.runtestmethod();

mymethod(Object o)ここで、内部で呼び出される が、他のオブジェクトではなくruntestmethod()Objectで呼び出されたことを確認したいと思います。oしかし、たとえば次のように、検証に何を入れても、常にテストに合格します。

Mockito.verify(mock.mymethod(Mockito.eq(obj)));

また

Mockito.verify(mock.mymethod(Mockito.eq(null)));

また

Mockito.verify(mock.mymethod(Mockito.eq("something_else")));

私はいつも試験に合格します。どうすればその検証を達成できますか (可能な場合)?

ありがとうございました。

4

11 に答える 11

447

の代替ArgumentMatcherは ですArgumentCaptor

公式の例:

ArgumentCaptor<Person> argument = ArgumentCaptor.forClass(Person.class);
verify(mock).doSomething(argument.capture());
assertEquals("John", argument.getValue().getName());

@Captorアノテーションを使用してキャプターを定義することもできます。

@Captor ArgumentCaptor<Person> captor;
//... MockitoAnnotations.initMocks(this);
@Test public void test() {
    //...
    verify(mock).doSomething(captor.capture());
    assertEquals("John", captor.getValue().getName());
}
于 2015-08-19T08:22:19.163 に答える
73

オブジェクトの.equalsメソッドを使用して論理的な等式を実行しようとしていますか?これは、Mockitoに含まれているargThatマッチャーを利用して行うことができます

import static org.mockito.Matchers.argThat

次に、各オブジェクトに準拠する独自の引数マッチャーを実装できます。.equalsメソッド

private class ObjectEqualityArgumentMatcher<T> extends ArgumentMatcher<T> {
    T thisObject;

    public ObjectEqualityArgumentMatcher(T thisObject) {
        this.thisObject = thisObject;
    }

    @Override
    public boolean matches(Object argument) {
        return thisObject.equals(argument);
    }
}

これで、コードを使用して、コードを更新して読み取ることができます...

Object obj = getObject();
Mockeable mock= Mockito.mock(Mockeable.class);
Mockito.when(mock.mymethod(obj)).thenReturn(null);

Testeable obj = new Testeable();
obj.setMockeable(mock);
command.runtestmethod();

verify(mock).mymethod(argThat(new ObjectEqualityArgumentMatcher<Object>(obj)));

正確な同等性(メモリ内の同じオブジェクト)を求める場合は、次のようにします。

verify(mock).mymethod(obj);

これにより、一度呼び出されたことが確認されます。

于 2013-03-02T19:24:36.110 に答える
61
  • eq他のマッチャーを使用しない場合、マッチャーは必要ありません。
  • 正しい構文を使用していません。メソッド呼び出しは.verify(mock). 何も検証せずに (メソッド呼び出しを行わずに)、メソッド呼び出しの結果の検証を開始しています。したがって、すべてのテストに合格しています。

コードは次のようになります。

Mockito.verify(mock).mymethod(obj);
Mockito.verify(mock).mymethod(null);
Mockito.verify(mock).mymethod("something_else");
于 2010-08-24T10:36:32.263 に答える
5

モック可能なクラスの equals メソッドを確認しましたか? これが常に true を返す場合、または同じインスタンスに対して同じインスタンスをテストし、equal メソッドが上書きされない (したがって、参照に対してのみチェックする) 場合、true を返します。

于 2012-03-02T08:17:42.697 に答える
4

もう 1 つの方法は、再定義する代わりに org.mockito.internal.matchers.Equals.Equals メソッドを使用することです。

verify(myMock).myMethod((inputObject)Mockito.argThat(new Equals(inputObjectWanted)));
于 2016-03-08T06:26:27.200 に答える
3

same() マッチャーで試しましたか? 次のように:

verify(mockObj).someMethod(same(specificInstance));

私も同じ問題を抱えていました。eq() マッチャーと refEq() マッチャーを試してみましたが、常に誤検知がありました。same() マッチャーを使用した場合、引数が異なるインスタンスの場合はテストが失敗し、引数が同じインスタンスの場合はパスしました。

于 2015-07-03T17:29:01.883 に答える