获取“ InvalidUseOfMatchersException”,即使使用正确也是如此

时间:2018-08-29 22:15:44

标签: java junit mockito

我有以下模拟对象:

@Mock
ObjectMapper objectMapper = new ObjectMapper();

然后我正在编写一些模拟逻辑,声称我做错了:

Mockito.when(objectMapper.writeValueAsString(Mockito.anyObject())).thenThrow(JsonProcessingException.class);

我哪里出错了?

2 个答案:

答案 0 :(得分:0)

  

anyObject()eq()之类的匹配器方法返回匹配器。在内部,它们在堆栈上记录一个匹配器,并返回一个虚拟值(通常为null)。此实现归因于Java编译器施加的静态类型安全性。结果是您不能在已验证/存根方法之外使用anyObject()eq()方法。

我的建议是使用any()

例如

@Test
public void TestObjectMapper() {
    //Arrange
    ObjectMapper objectMapper = mock(ObjectMapper.class);
    when(objectMapper.writeValueAsString(any()))
        .thenThrow(new JsonProcessingException());

    //...
}

答案 1 :(得分:0)

我在测试中使用@InjectMocks类,并使用@Mock自动创建和注入模拟。这对我来说很好用。

类似这样的东西:

@RunWith(MockitoJUnitRunner.class)
public final class ClassTest{

    @InjectMocks
    private ClassUnderTest objectOfClass;

    @Mock 
    private ObjectMapper objectMapper = new ObjectMapper();

    @Test (expected = JsonProcessingException.class)
    public void testMethod() {
        when(objectMapper.writeValueAsString(anyObject()))
       .thenThrow(JsonProcessingException.class);
    }
}

如果未在测试的函数调用中为所有参数使用匹配器,则可能发生InvalidUseOfMatchersException。

赞:

when(mock.doSomething(any(), someMock)).thenReturn(something); // This can generate the exception.

您可以改用的是:

when(mock.doSomething(any(),eq(someMock))).thenReturn(something); // Here we use eq matcher instead of simply passing the mock