web-dev-qa-db-ja.com

何かに等しくないマッチャーの書き方

コールのモックを作成しようとしています。私がスタブしようとしているこの方法があるとしましょう:

_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()をどのように一致させるのですか?

41
Churk

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

それが役に立てば幸い。

84
troig

HamcrestでargThatを使用します。

_when(classA.getString(argThat(CoreMatchers.not(CoreMatchers.equalTo("a")))...
_

注文によりこれを行うこともできます。 when(anyString)when(eq("a"))を正しい順序で配置すると、Mockitoはそれらを順番にテストし、必要に応じて「a」ロジックを実行し、それ以外の場合は「anyString」ロジックを実行します。

8
John B

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を使用していることに注意してください。

1
Pieter De Bie

提案された答えを注意深く見て、実際にこのアプローチを取りました。

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つ以上のケースを処理できます。

0
Churk