为了账号安全,请及时绑定邮箱和手机立即绑定

PowerMockito.mockStatic() 但在调用静态方法时仍然得到 NPE

PowerMockito.mockStatic() 但在调用静态方法时仍然得到 NPE

Cats萌萌 2022-05-25 15:47:22
注意 - 我已经标记LINE了我在问题中讨论的 3 个数字,您可能需要在代码片段中向右滚动才能看到。我真的在努力用 chained Optional.map()s 对一个方法进行单元测试。@Overridepublic void accept(Object message){    extractSenderReference(message.toString())        .map(t ->        {            t.setTransactionStatus("TAG1"); //  <- LINE #1            return t;        })        .map(StaticConverter::convert) //< -LINE #2        .ifPresent(Persist::persist);}WhereextractSenderReference()返回一个Optional类型Obj并且是一个私有方法。我的测试:@RunWith(PowerMockRunner.class)@PrepareForTest({ClassBeingTested.class, StaticConverter.class})public class MyTest {private ClassBeingTested updateProcessor = PowerMockito.spy(new ClassBeingTested());private StatusDataObj statusDataObj = mock(StatusDataObj.class);@Testpublic void testSomething() throws Exception{    Obj myObj = getObj();    PowerMockito.mockStatic(StaticConverter.class);    PowerMockito.doReturn(Optional.ofNullable(myObj)).when(updateProcessor, "extractSenderReference", anyString()); // <- LINE #3    when(StaticConverter.convert(myObj)).thenReturn(statusDataObj);    updateProcessor.accept("MESSAGE1");}private Obj getObj(){    Obj obj = new Obj();    obj.setId(100L);    return obj; }}在LINE #1,如我的方法中所标记的accept(),对象t已被处理并已transactionStatus成功设置。但是,LINE #2在运行上述测试时,我得到了 NPE。我也尝试过PowerMockito.spy(StaticConverter.class);而不是PowerMockito.mockStatic(StaticConverter.class);按照https://github.com/powermock/powermock/wiki/Mockito#mocking-static-method但我得到相同的 NPE。我的想法是地图正在转换t为StatusDataObj类型。所以当 map 调用时convert,我会存根并返回我的类型。但是,最初我期望这将有效地处理返回 from上LINE #3的链式map调用,因为我使用的是设置了值的真实对象,但其他地方必须有一个空值?OptionalextractSenderReference()
查看完整描述

3 回答

?
森林海

TA贡献2011条经验 获得超2个赞

尝试用对StaticConverter::convert实际方法的显式 lambda 调用替换方法引用:e -> StaticConverter.convert(e)

我遇到了 Powermock 模拟方法引用的问题,但是通过将其保留为显式方法调用,我可以成功地模拟这些调用。


查看完整回答
反对 回复 2022-05-25
?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

您需要将类添加到@PrepareForTest您将在该测试中使用的类:


@RunWith(PowerMockRunner.class)

@PrepareForTest(StaticConverter.class, ClassBeingTested.class)

Powermock 需要知道您将在这些类中使用它。


查看完整回答
反对 回复 2022-05-25
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

Persist为空。我不确定为什么 NPE 在LINE 2.



查看完整回答
反对 回复 2022-05-25
  • 3 回答
  • 0 关注
  • 530 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号