7

Mockito を使用してコードのテストを作成しています。ただし、次のシナリオで立ち往生しています-クラスAには、method1()とmethod2()の2つのメソッドがあります。ArgumentCaptor を使用して、method2() に送信された値をキャッチしようとしました。しかし、@Spy を使用しているため、Matchers を使用できません。

method1() をテストするにはどうすればよいですか?

class A{
    B b;
    method1(arg1, arg2){
       //some logic
       method2(arg1, arg2, ....argN);
    }

   method2(arg1, arg2,....argN){
       //some logic
       b.method3(arg1, arg2...);
   }
}

method2 が同じ引数値を受け取ることを確認する方法は? 以下は私が書いたテストクラスです:

Class TestA{

@Mock
B b;

@Spy
@InjectMocks   //required else b is null
A a = new A();

@Test
public void testMethod1(){

 a.method1(arg1, arg2);

  //How to verify method2 receives same argument values (arg1, arg2)????
  //verify(a, times(1)).method2(.......);   
}

}

4

3 に答える 3

11

私はこの投稿と@Davidが残したコメントに興味をそそられたので、私のようにフォローしている人のために実用的な例をコーディングすることにしました。

/*
 * class to test
 */
public class A {

    public void methodA(String str) {
        this.methodB(str);
    }

    protected void methodB(String str) {
        // some implementation
    }
}

methodB()に渡される値は、私たちが期待するものであると断言したいと思います。ArgumentCaptorを読んだことで、同等のCaptorアノテーションを発見しました。

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.verify;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Spy;
import org.mockito.runners.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
public class MultipleMethodCallTest {

    @Spy
    A a = new A();

    @Captor ArgumentCaptor<String> captor;

    @Test
    public void captureSecondMethodCallArgument() throws Exception {

        // EXPECTED

        String greeting = "hello world";

        // PERFORM TEST

        a.methodA(greeting);

        // ASSERT

        verify(a).methodB(captor.capture());

        assertEquals(greeting, captor.getValue());
    }
}

この例はでテストされました

  • mockito-all-1.8.5.jar
  • junit-4.8.2.jar
于 2012-05-25T11:38:58.507 に答える
3

できません。B の method3 呼び出しで確認する必要があります。method2 への引数が method3 に影響を与えない場合、これらの引数はまったく役に立たない可能性があります?!

于 2012-04-23T20:34:54.713 に答える
2

スパイでマッチャーを使用できます。これはうまくいきます。なぜできないと思ったのかわかりません。

ソースコードを取得し、コンパイルできるように編集しました。次に、への呼び出しを追加しましたMockitoAnnotations.initMocks-スパイとモックを作成し、モックを注入するためにこれが必要です(を使用しない限りMockitoJUnitRunner、それはあなたのinitMocksために行います)。verify呼び出しの を元にmethod2戻しました。これはうまくいきました。

したがって、Omnaest の回答に反して、これを確認するために B を使用する必要はありませんmethod3。あなたの唯一の問題は、initMocks.

頑張ってください。さらにサポートが必要な場合は、お気軽に再度投稿してください。

于 2012-04-24T06:16:36.130 に答える