注意 - 我已经标记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 模拟方法引用的问题,但是通过将其保留为显式方法调用,我可以成功地模拟这些调用。

尚方宝剑之说
TA贡献1788条经验 获得超4个赞
您需要将类添加到@PrepareForTest您将在该测试中使用的类:
@RunWith(PowerMockRunner.class)
@PrepareForTest(StaticConverter.class, ClassBeingTested.class)
Powermock 需要知道您将在这些类中使用它。
添加回答
举报
0/150
提交
取消