注意-我在问题中讨论了3个LINE
数字,您可能需要在代码段中向右滚动才能看到。
我真的在用链式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);
}
extractSenderReference()
返回类型为Optional
的{{1}},并且是私有方法。
我的测试:
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
,运行上述测试时我得到了NPE。
我也尝试使用LINE #2
而不是https://github.com/powermock/powermock/wiki/Mockito#mocking-static-method的PowerMockito.spy(StaticConverter.class);
,但是我得到了相同的NPE。
我的想法是地图将PowerMockito.mockStatic(StaticConverter.class);
转换为t
类型。因此,当地图调用StatusDataObj
时,我将存根并返回我的类型。但是,最初我期望convert
会有效地处理从LINE #3
返回的map
上的链式Optional
调用,因为我正在使用带有值的实对象设置,但其他位置必须有一个空值?
答案 0 :(得分:1)
尝试用对实际方法StaticConverter::convert
的显式lambda调用替换方法引用e -> StaticConverter.convert(e)
。
我在使用Powermock模拟方法引用时遇到问题,但是通过将其保留为显式方法调用,我可以成功模拟那些调用。
答案 1 :(得分:0)
Persist
为空。我不确定为什么NPE位于LINE 2
。
答案 2 :(得分:-1)
您需要将类添加到要在该测试中使用的类上@PrepareForTest
:
@RunWith(PowerMockRunner.class)
@PrepareForTest(StaticConverter.class, ClassBeingTested.class)
Powermock需要意识到您将在这些课程中使用它。