使用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));
}

你遇到了嘲笑。

在这里:

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

根本不会使有道理

嘲笑这样的作品:

  1. 您创建了某些类的模拟对象,例如A mock = mock(A.class)
  2. 您在该模拟对象上指定互动

您的代码意味着您认为这些规格像"正常"代码一样工作 - 但是它们不是

您想做的事情:使用某些参数调用某些对象,然后返回 emage ene 方法调用的结果。

喜欢:

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

这就是您打算做的想要做的。但是事实是:这并不容易。您不能在thee 中使用 any() Matcher 部分,以"提供"以前在 when()呼叫中传递的参数!就是这样。

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

含义:您不是在编写一个普通程序,在该程序中将"向前"参数"转发"到另一个呼叫。换句话说;您的代码应该看起来更像:

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

那是唯一的在这里可能。

除此之外,您可能需要在此处查看overito Enter Link Description。

长话短说:看起来您不明白如何使用模拟框架。我建议您退后一步,阅读/工作各种教程。这不是您通过反复试验学习的东西。

相关内容

最新更新