我在使用Mockito的匹配器运行JUnit测试时遇到错误
org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
Invalid use of argument matchers!
0 matchers expected, 1 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"));
这是源代码。
class A
{
public String getField()
{
return "hi";
}
}
@Test
public void testA()
{
final A a = mock(A.class);
when(a.getField()).thenReturn(Matchers.any(String.class));
a.getField();
}
这里有什么问题?请睁开眼睛!
答案 0 :(得分:2)
您使用的是argument matcher:Matchers.any(String.class)
。参数匹配器不能用作返回存根方法的值。
当您需要自定义方法存根的方式时,应使用参数匹配器:
when(a.sayHello(Matchers.any(String.class))).thenReturn("Hello");
在您的示例中,您必须返回String的实例而不是匹配器:
when(a.getField()).thenReturn("theFieldValue");
答案 1 :(得分:0)
您犯了经典错误,即嘲笑您正在尝试测试的课程。模拟的全部内容是您从测试中删除其他类。因此,如果您正在以某种方式测试使用类A
的对象的类B
,则可以模拟类B
。但是你不会嘲笑你实际测试的类,因为那时你不再测试类,而是测试模拟框架。
为了测试您提供的方法,根本不使用Mockito是没有意义的;因为您的测试不需要考虑其他课程。唯一的课程是A
- 您正在测试的课程。
您的测试应该是以下
public class TestA {
private A toTest = new A();
@Test
public void getFieldReturnsHi() {
assertEquals("Hi", toTest.getField());
}
}