在我的代码中,我有一个使用 ObjectMapper.readValue 的方法,我想模拟它以进行测试。 这是代码的分区:
if (entity != null) {
String result = EntityUtils.toString(entity);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, true);
return objectMapper.readValue(result, classeObjetRetour);
}
当我试图在我的测试类中定义它时:
String retour = EntityUtils.toString(httpEntity);
IdentifiantEnveloppe identifiantAttendu = new IdentifiantEnveloppe();
ObjectMapper objectMapper = mock(ObjectMapper.class);
doReturn(identifiantAttendu).when(objectMapper).readValue(retour, IdentifiantEnveloppe.class);
我有以下错误:
org.mockito.exceptions.base.MockitoException:
Mockito cannot mock this class: class com.fasterxml.jackson.databind.ObjectMapper.
Mockito can only mock non-private & non-final classes.
If you're not sure why you're getting this error, please report to the mailing list.
如果有人能帮助我,我将不胜感激。我在 Java 8
谢谢
答案 0 :(得分:2)
if (entity != null) {
String result = EntityUtils.toString(entity);
ObjectMapper objectMapper = new ObjectMapper(); // this line is the problem.
objectMapper.configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, true);
return objectMapper.readValue(result, classeObjetRetour);
}
由于您在上面创建了 ObjectMapper 的新实例,因此您的模拟不起作用。正如在您的测试类中的最后一行永远不会发生:
String retour = EntityUtils.toString(httpEntity);
IdentifiantEnveloppe identifiantAttendu = new IdentifiantEnveloppe();
ObjectMapper objectMapper = mock(ObjectMapper.class);
doReturn(identifiantAttendu).when(objectMapper).readValue(retour, IdentifiantEnveloppe.class);
因为调用 Mockito.when() 的 objectMapper 是另一个实例而不是类中的实例。所以 objectMapper.readValue() 永远不会在你的模拟上被调用。
你应该尝试在你的类中模拟 objectMapper。您可以将 objectMapper 定义为类字段,以便您可以通过构造函数将 objectMapper 注入到您的类中。在你的测试类中,你可以注入一个模拟(ObjectMapper.class)而不是一个真实的。