使用Mockito thenCallRealMethod时出现NullPointerException

时间:2018-05-29 15:42:18

标签: java unit-testing mockito

我有一个关于使用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,它包含一堆字段,但没什么特别有趣的,数据是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)

1 个答案:

答案 0 :(得分:1)

使用模拟对象时,不会初始化真实对象。这意味着即使具有默认值的任何属性都将为null。

在我的情况下,我有一个从属性文件中注入@Value的属性,但是如果定义默认值,它也会发生相同的情况,将要使用时为null。

解决方案:您必须检查哪个属性导致方法上的空指针异常,然后模拟返回该属性期望值的getter并从您的实际方法中调用getter或使用setter设置其值从测试开始,在创建模拟对象之后