4

ユニットテストにMockitoを使用しています。いくつかの入力を設定するvoidメソッドをモックする必要があります。 非常に素朴な例:

class Something {
   AnotherThing thing = new AnotherThing();
   public int doSomething(Stuff stuff)
   {
      thing.doThing(stuff);
      if(thing.getName().equals("yes")){
        return 1;
      }
      else {
        return 2;
      }
   }
}

class AnotherThing() {
   public void doThing(Stuff stuff){
       if(stuff.getName().equals("Tom")) {
          stuff.setName("yes");
       }
       else {
          stuff.setName("no");
       }
   }
}

class Stuff()
{
   String name;
   // name getters and setters here
}

AnotherThingこの場合、私はテストするためにモックを作成しようとしていますSomething

ただし、テストしているクラスでは、このvoidメソッドを複数回呼び出します。Answer呼び出すたびに異なる「」が必要です。つまり、voidメソッドを呼び出して、呼び出されるたびにさまざまなことを実行したいと思います。

APIを調べましたが、解決策が見つかりませんでした。これはMockitoでも可能ですか?

4

5 に答える 5

5

必要なのはMockitoAnswerオブジェクトです。これは、モックのメソッドが呼び出されたときに実行できる機能のほんの一部を含むオブジェクトです。doAnswer詳細については、のMockitoドキュメントを確認してください。でも基本的にはこんな感じです。

  doAnswer(new Answer<Object>(){
        @Override
        public Object answer(InvocationOnMock invocation){
           Object[] arguments = invocation.getArguments();
           Stuff argument = (Stuff) arguments[0];
           if(stuff.getName().equals("Tom")) {
              stuff.setName("yes");
           }
           else {
              stuff.setName("no");
           }
           return null;
        }
     }).when(mockObject).doThing(any(Stuff.class));
于 2012-07-24T08:47:48.940 に答える
3

より簡単な方法があります:

doNothing().doNothing().doThrow(new RuntimeException()).when(mock).someVoidMethod();

このように、メソッドへの複数の呼び出しは異なることを行うことができます。

于 2015-04-02T16:09:47.493 に答える
2

Mockitoを使用すると、連続した呼び出しをスタブすることができます。これがあなたに必要なものだと思います。mockitoドキュメントの必要な部分へのリンクは次のとおりです。

あなたはこのように書くことができます:

Mockito.when(mockAnotherThing.doThing(stuff)).thenReturn("yes").thenReturn("no");

このモッキートの後、最初の呼び出しでは「はい」が返され、2番目の呼び出しでは「いいえ」が返されます。

ちなみに、サンプルコードを次のように変更する必要があると思います(それ以外の場合は機能しません)。

class AnotherThing() {
   public String doThing(Stuff stuff){
       if(stuff.getName().equals("Tom")) {
         return "yes";
       }
       else {
          return "no";
       }
   }
}
于 2012-07-24T06:09:30.207 に答える
0

なぜ違うものが必要なのAnswerですか?同じものを使用できます:

doAnswer(new Answer<Object>(){
    private int call;
    @Override
    public Object answer(InvocationOnMock invocation){
        ...
        call = call + 1;
        if (call % 2 == 0) {
        //do something
        } else {
        //another behavior 
        }
    }
 }).when(mockObject).doThing(any(Stuff.class));
于 2012-07-24T09:40:15.020 に答える
0

戻り型がvoidであるため、equalsを使用することはできません。doThing()の戻り型をStringに変更してから、このようにモックします。

 Anotherthing anotherthing = mock(Anotherthing.class)
 when(anotherThing.doThing(isA(Stuff.class))).thenReturn("yes").thenReturn("no");

これを複数回モックすることもできます。そうでない場合は、2回連続して呼び出した後の最後のスタブ値(「no」が返されます)。

于 2012-07-24T06:25:08.457 に答える