对于明显模拟的类,导致InvalidUseOfMatchersException

时间:2014-05-26 10:51:08

标签: mockito

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

这里有什么问题?请睁开眼睛!

2 个答案:

答案 0 :(得分:2)

您使用的是argument matcherMatchers.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());
    }
}