我有一种需要调用的方法,而不是真实的方法。相反,我得到了例外。有人可以通过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));
根本不会使有道理。
嘲笑这样的作品:
- 您创建了某些类的模拟对象,例如
A mock = mock(A.class)
- 您在该模拟对象上指定互动
您的代码意味着您认为这些规格像"正常"代码一样工作 - 但是它们不是!
您想做的事情:使用某些参数调用某些对象,然后返回 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。
长话短说:看起来您不明白如何使用模拟框架。我建议您退后一步,阅读/工作各种教程。这不是您通过反复试验学习的东西。