10

多分これは初心者の質問ですが、答えが見つかりません。

Mockito でメソッドをスタブする必要があります。メソッドに「単純な」引数がある場合は、実行できます。たとえば、車の色とドアの数の 2 つのパラメーターを使用する find メソッドの例を次に示します。

 when(carFinderMock.find(eq(Color.RED),anyInt())).thenReturn(Car1);
 when(carFinderMock.find(eq(Color.BLUE),anyInt())).thenReturn(Car2);
 when(carFinderMock.find(eq(Color.GREEN), eq(5))).thenReturn(Car3);

問題は、find 引数が複雑なオブジェクトであることです。

 mappingFilter = new MappingFilter();
 mappingFilter.setColor(eq(Color.RED));
 mappingFilter.setDoorNumber(anyInt());
 when(carFinderMock.find(mappingFilter)).thenReturn(Car1);

このコードは機能しません。エラーは「引数マッチャーの無効な使用です! 1 つのマッチャーが期待され、2 つが記録されました」です。

「find」メソッドを変更できません。MappingFilter パラメータである必要があります。

mappingFilter.getColor が RED で、mappingFilter.getDoorNumber が any の場合、Car1 を返す必要があることを Mockito に示すために「何か」を行う必要があると思います (他の 2 つの文についても同じです)。しかし、どのように?

4

3 に答える 3

11

ドキュメントに示されているように、Hamcrest マッチャーを使用します。

when(carFinderMock.find(argThat(isRed()))).thenReturn(car1);

は次のようにisRed()定義されます

private Matcher<MappingFilter> isRed() {
    return new BaseMatcher<MappingFilter>() {
        // TODO implement abstract methods. matches() should check that the filter is RED.
    }
}
于 2013-02-28T16:31:47.133 に答える
1

MappingFilterequals()のメソッドを正しく実装する必要があります。equals() では、 color のみを比較し、 doorNumberは比較しないでください。

最も単純な形式では、次のようになります-

@Override
public boolean equals(Object obj) {
    MappingFilter other = (MappingFilter) obj;
    return other.getColor() == this.getColor();
}

また、eq などのマッチャーを使用する代わりに、以下のように単純に MappingFilter を作成する必要があります。

 mappingFilter = new MappingFilter();
 mappingFilter.setColor(Color.RED);
 mappingFilter.setDoorNumber(10); //Any integer
于 2013-02-28T16:25:59.723 に答える