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

时间:2019-01-29 13:55:14

标签: java unit-testing mockito optional powermockito

注意-我在问题中讨论了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-methodPowerMockito.spy(StaticConverter.class);,但是我得到了相同的NPE。

我的想法是地图将PowerMockito.mockStatic(StaticConverter.class);转换为t类型。因此,当地图调用StatusDataObj时,我将存根并返回我的类型。但是,最初我期望convert会有效地处理从LINE #3返回的map上的链式Optional调用,因为我正在使用带有值的实对象设置,但其他位置必须有一个空值?

3 个答案:

答案 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需要意识到您将在这些课程中使用它。