7

我正在使用 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...);
   }
}

如何验证 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 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());
    }
}

这个例子已经过测试

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

你不能,你必须通过 B 的 method3 调用来验证它。如果您对method2的args对method3没有影响,那么这些args可能根本没用?!

于 2012-04-23T20:34:54.713 回答
2

您可以将匹配器与间谍一起使用;这很好用。我不知道你为什么认为你不能。

我获取了您的源代码并对其进行了编辑以使其编译。然后我添加了一个调用MockitoAnnotations.initMocks- 你需要它来创建间谍和模拟,并注入模拟(除非你使用MockitoJUnitRunner,它initMocks为你做的)。我把verify电话放method2回去了。这很好用。

因此,与 Omnaest 的回答相反,您不需要使用 Bmethod3来验证这一点。我怀疑您唯一的问题是您忘记了initMocks.

祝你好运,如果您需要更多帮助,请随时再次发布。

于 2012-04-24T06:16:36.130 回答