使用Mockito调用模拟方法而不是真实方法

时间:2017-06-26 03:40:05

标签: junit mocking mockito

我有一个需要调用的方法而不是真正的方法。 相反,我得到一个例外。有人可以通过mockito以正确的方式帮助我调用替代方法吗?

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Invalid use of argument matchers!
2 matchers expected, 4 recorded.
This exception may occur if matchers are combined with raw values:
    //incorrect:
    someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
    //correct:
    someMethod(anyObject(), eq("String by matcher"));




    //Code starts here
class A{
   public realMethod(String s, Foo f){

   }
}

class B {
    public mockMethod(String s, Foo f) {

    }
}

class UnitTestClass{
    ClassA mock = new ClassA();
    mock.when(realMethod(any(String.class), any(Foo.class))).thenReturn(mockMethod(any(String.class),any(Foo.class));
}

1 个答案:

答案 0 :(得分:1)

你正在嘲笑错误。

下面:

thenReturn(mockMethod(any(String.class),any(Foo.class));

这根本不会使感觉

模拟的工作原理如下:

  1. 您创建某个类的模拟对象,例如A mock = mock(A.class)
  2. 您在该模拟对象上指定交互
  3. 您的代码暗示您认为这些规范的工作方式与#34;正常"代码 - 但他们

    您想要做什么:使用某些参数调用某个对象时,然后会返回另一个方法调用的结果。

    喜欢在:

    when(a.foo(x, y)).thenReturn(b.bar(x, y))
    

    这就是你打算做的想要。但问题是:它并不容易。您无法在 thenReturn 部分中使用any()匹配器,以便"提供"以前在when()电话中传递的参数!就是这么简单。

    模拟应该在特定的单元测试中,以获得特定的结果。

    含义:你不是在编写一个普通的程序,它会使任何感觉到"转发"参数到另一个电话。换一种说法;你的代码应该更像:

    when(mock.realMethod("a", someSpecificFoo)).thenReturn(mockMethod("a", someSpecificFoo))
    

    这是唯一的事情。

    除此之外,您可能想要查看Mockito enter link description here

    长话短说:看起来你似乎并不了解如何使用模拟框架。我建议您退一步阅读/工作各种教程。这不是你通过反复试验学到的东西。