java - 使用 Mockito thenCallRealMethod 时出现 NullPointerException
问题描述
我有一个关于使用 Mockito thenCallRealMethod 的问题。我已阅读有关使用此功能的警告;基本上我想把它写到我的测试中来保证我的应用程序逻辑的未来,因为它被用作一个库,我想确保我的库的用户有未来的保护。
我的测试用例如下所示:
@Test
public void Test() {
when(restTemplate.postForEntity(...)).thenReturn(new ResponseEntity<>(realObjectMapper.writeValueAsString(data), HttpStatus.OK));
when(objectMapper.readValue(realObjectMapper.writeValueAsString(data), TestData.class)).thenCallRealMethod();
TestData result = tested.callMethod(...);
....
}
TestData 是一个简单的 POJO,它包含一堆字段但没有什么特别有趣的,data 是 TestData 的一个实例。objectMapper 是FasterXML Jackson ObjectMapper的模拟实例,而 realObjectMapper 是同一类的真实(非模拟)实例。
当我的应用程序尝试根据测试第二行的 thenCallRealMethod 执行 objectMapper.readValue (在模拟实例上)时,我遇到的问题是 NullPointerException。我已经验证,当我将相同的输入传递给 realObjectMapper.readValue 时,它执行得很好,所以输入没有问题。我错过了什么?
Stack trace:
java.lang.NullPointerException
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2842)
.... (my code here)
解决方案
当您使用模拟对象时,不会初始化真实对象。这意味着即使具有默认值的任何属性都将为空。
在我的例子中,我有一个从属性文件中注入了@Value 的属性,但是如果我定义了一个默认值,它会发生相同的情况,当它将被使用时它是空的。
解决方案:您必须检查哪个属性导致方法上出现空指针异常,然后模拟一个返回该属性预期值的 getter 并从您的真实方法调用 getter,或者使用测试中的 setter 设置其值,创建模拟对象后
推荐阅读
- python - 如何从 sqlite3 获取“NOT NULL”
- webpack - PhotoSwipe 和 Webpack:无法解析路径
- javascript - JavaScript,用数组改变对象的值而不影响整个对象
- python - 预计不会出现python识别错误
- ruby-on-rails - PG :: UndefinedTable:错误:在heroku上
- r - 将图例添加到两个 geom_point()
- c# - asp.net 删除框架
- html - 单击引导下拉菜单时,div中的所有元素都移到中心
- javascript - Angular 中的不记名令牌
- css - 菜单中有多个单词时换行