我有以下模拟对象:
@Mock
ObjectMapper objectMapper = new ObjectMapper();
然后我正在编写一些模拟逻辑,声称我做错了:
Mockito.when(objectMapper.writeValueAsString(Mockito.anyObject())).thenThrow(JsonProcessingException.class);
我哪里出错了?
答案 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