Mockito间谍测试

ace*_*es. 7 java spring mockito

我正在使用Mockito编写代码测试.但是我被困在以下场景中--A类有2个方法,method1()和method2().我尝试使用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...);
   }
}
Run Code Online (Sandbox Code Playgroud)

如何验证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(.......);   
}
Run Code Online (Sandbox Code Playgroud)

}

Bra*_*rad 9

我被这篇文章和@David留下的评论所吸引,所以我决定为像我一样的人编写一个有效的例子

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

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

    protected void methodB(String str) {
        // some implementation
    }
}
Run Code Online (Sandbox Code Playgroud)

我们想断言传递给methodB()的值是我们所期望的.阅读ArgumentCaptor让我发现了等效的Captor Annotation

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

这个例子进行了测试

  • 的Mockito-ALL-1.8.5.jar
  • JUnit的-4.8.2.jar