【问题标题】:Mockito verify returns error "Invalid use of argument matchers! 1 matchers expected, 3 recorded"Mockito 验证返回错误“参数匹配器的使用无效!预期 1 个匹配器,已记录 3 个”
【发布时间】:2019-08-27 22:18:45
【问题描述】:

类结构如下:

Class A{
    private B b;

    public void methodA(int x, String y, String z){
        if methodB(int x, String y, methodC(String z)){
            // do stuff
        } else {
            //do stuff
        }
    }

    public boolean methodB(int p, String q, int r){
        //do stuff
        return c; //boolean
    }

    public Integer methodC(String x){
        // do stuff
        return y; //Integer
    }
}

我正在为 methodA 编写单元测试,我希望确保 methodB 只被调用一次。

我为此尝试使用 Mockito。

public class TestModule{
    @Mock
    B b;

    @InjectMocks
    A a;

    @Before
    Public void setup(){
        MockitoAnnotations.initMocks(this);
    }

    // other tests

    @Test
    public void testMethodA(){
        Mockito.when(a.methodB(Mockito.anyInt(), Mockito.anyString(), Mockito.anyInt())).thenReturn(Mockito.anyBoolean());
        verify(a, times(1)).methodB(Mockito.anyInt(), Mockito.anyString(), Mockito.anyInt());
    } 
} 

我收到一个错误: 参数匹配器的使用无效! 预计有 1 个匹配者,记录了 3 个: 指向代码行“Mockito.when ...”三次。

我不太确定出了什么问题。请帮我弄清楚。还有我想念的更好或更简单的方法吗?

非常感谢。

【问题讨论】:

  • 您不应该在thenReturn 函数中使用ArgumentMatcher 之类的anyBoolean()。这些仅用于匹配参数。而是返回一个实际值。
  • 您也不能在非模拟对象上使用Mockito.when (a)。您想在模拟 b 上定义行为。但是,您的代码示例没有显示 b 的用途。 a 是您正在测试的课程,不应被嘲笑。
  • 谢谢@second。我嘲笑 b 因为我有其他方法可以测试,它们工作得很好。感谢您对 ArgumentMatcher 和 Mockito 的澄清。

标签: spring spring-mvc junit mockito


【解决方案1】:

我认为你误解了 mockito 的一般用法。

  • 我假设你想测试真正的 A 类(特别是 methodA 的行为),但是......

    你从不调用(exercise 在测试术语中)它。 相反,您错误地使用了用于 stubbing 方法的 Mockito.when 方法。

  • 我不明白b属性的含义。您在 A 中注入了它的模拟版本,但是……您从未使用过它。

  • 让我强调一下,一般不应测试对内部方法的调用(仅验证对外部方法的调用)。

  • 通常您会检查 (Mockito.verify()) 模拟对象的行为

  • 如果你想检查真实的物体,你必须窥探它们。

    因此,检查真实 SUT 对象的内部调用(不是很有趣)问题的一个可能解决方案是:

    public class TestModule{
    
      A a;
    
      @Test
      public void testMethodAcallsInternalMethodB(){
        //SETUP
        a = Mockito.spy(new A()); // to be able to verify behaviour of the SUT
    
        //EXERCISE
        a.methodA(5, "foo", "baa");
    
        //VERIFY
        Mockito.verify(a, times(1))
          .methodB(
            Mockito.eq(5),
            Mockito.eq("foo"),
            Mockito.anyInt()
          );
      } 
    } 
    

【讨论】:

    猜你喜欢
    • 2020-03-23
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多