コールのモックを作成しようとしています。私がスタブしようとしているこの方法があるとしましょう:
_class ClassA {
public String getString(String a) {
return a + "hey";
}
}
_
私がモックアウトしようとしているのは、最初のインスタンスが
_when(classA.getString(eq("a")).thenReturn(...);`
_
同じテストケースで
_when(classA.getString([anything that is not a])).thenReturn(somethingelse);
_
2番目のケースは私の質問です。「a」以外のanyString()
をどのように一致させるのですか?
Mockito
フレームワークでは、 AdditionalMatchers を使用できます。
ClassA classA = Mockito.mock(ClassA.class);
Mockito.when(classA.getString(Matchers.eq("a"))).thenReturn("something");
Mockito.when(classA.getString(AdditionalMatchers.not(Matchers.eq("a")))).thenReturn("something else");
それが役に立てば幸い。
HamcrestでargThat
を使用します。
_when(classA.getString(argThat(CoreMatchers.not(CoreMatchers.equalTo("a")))...
_
注文によりこれを行うこともできます。 when(anyString)
とwhen(eq("a"))
を正しい順序で配置すると、Mockitoはそれらを順番にテストし、必要に応じて「a」ロジックを実行し、それ以外の場合は「anyString」ロジックを実行します。
Mockitoでは、最後のスタブが最も重要です。これは、ニーズに合わせて標準マッチャーを簡単に使用できることを意味します。
// "Default" return values.
when(classA.getString(ArgumentMatchers.anyString())).thenReturn(somethingelse);
// Specific return value for "a"
when(classA.getString(ArgumentMatchers.eq("a"))).thenReturn(something);
haveを使用しているので、両方にArgumentMatchersを使用していることに注意してください。
提案された答えを注意深く見て、実際にこのアプローチを取りました。
doAnswer(new Answer<String>() {
public String answer(InvocationOnMock invocation) throws Throwable {
String originalParam = (String) invocation.getArguments()[0];
return StringUtils.equalsIgnoreCase(originalParam, "a") ? "Something" : "Something Else";
}
}).when(classA).getString(anyString());
これにより、paramsのreturn baseを調整することで、2つ以上のケースを処理できます。