Mockito 只能模拟 non-private 和 non-final 类

时间:2021-02-18 11:35:17

标签: java mockito

在我的代码中,我有一个使用 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

谢谢

1 个答案:

答案 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)而不是一个真实的。