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 中。
解决方案
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)而不是一个真实的。
推荐阅读
- sql - 根据begdate和enddate将单行拆分为多行?
- flutter - 带边框的颤振圆形头像
- sql - 调整组内的日期重叠
- android - 如何在 android 设备中使用不同的屏幕尺寸特定值
- python - 使用 PyQt5 构建并由 pyinstaller 编译的 GUI 无法正常工作 [不重复]
- react-native - 堆栈导航器在发布 apk 中不起作用
- python - Python/C++:可以导入 Armadillo (arma::) 但不能导入子程序 arma::arma_rng::randn
- arrays - 将标题与字符串中的正文分开或如何按 2 "\n" 解析?科特林
- vue.js - 迭代中的元素期望在 VueApp 中有 'v-bind:key' 指令
- javascript - 反应:春季过渡行为不正常