莫基托间谍测试



我正在使用Mockito编写代码测试。但是我被困在以下情况下 -类 A 有 2 个方法,method1() 和 method2()。我尝试使用 ArgumentCaptor 来捕获发送到 method2() 的值。但是,由于我使用的是@Spy,因此我无法使用匹配器。

如何测试方法1()?

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

如何验证方法2是否收到相同的参数值?以下是我写的测试类:

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(.......);   
}

}

我对

这篇文章和@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());
    }
}

此示例已使用

  • 模拟所有-1.8.5.jar
  • Junit-4.8.2.jar

你不能,你必须通过 B 的方法 3 调用来验证它。如果你对方法2的参数对方法3没有影响,那么这些参数可能根本就没用?!

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新