gpt4 book ai didi

java - 使用 Mockito thenCallRealMethod 时出现 NullPointerException

转载 作者:行者123 更新时间:2023-12-04 13:02:57 24 4
gpt4 key购买 nike

我有一个关于使用 Mockito thenCallRealMethod 的问题。我已阅读有关使用此功能的警告;基本上我想把它写到我的测试中来证明我的应用程序逻辑,因为它被用作一个库,我想确保我的库的用户有 future 的保护。

我的测试用例如下所示:

@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)

最佳答案

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

在我的例子中,我从属性文件中注入(inject)了一个 @Value 的属性,但是如果我定义了一个默认值,它会发生同样的情况,当它被使用时它是空的。

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

关于java - 使用 Mockito thenCallRealMethod 时出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50588232/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com