我有一个需要调用的方法而不是真正的方法。 相反,我得到一个例外。有人可以通过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));
}
答案 0 :(得分:1)
你正在嘲笑错误。
下面:
thenReturn(mockMethod(any(String.class),any(Foo.class));
这根本不会使感觉。
模拟的工作原理如下:
A mock = mock(A.class)
您的代码暗示您认为这些规范的工作方式与#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。
长话短说:看起来你似乎并不了解如何使用模拟框架。我建议您退一步阅读/工作各种教程。这不是你通过反复试验学到的东西。