首页 > 解决方案 > 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 中。

标签: javamockito

解决方案


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


推荐阅读