注意 - 我已经标记LINE了我在问题中讨论的 3 个数字,您可能需要在代码片段中向右滚动才能看到。
我真的在努力用 chained Optional.map()s 对一个方法进行单元测试。
@Override
public 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);
@Test
public 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()
森林海
尚方宝剑之说
鸿蒙传说
相关分类