繁体   English   中英

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

[英]PowerMockito.mockStatic() but still getting NPE when static method is called

注-我已经打上3 LINE数字,我在我的问题讨论,您可能需要滚动到代码段右看看。

我真的很努力地对一个带有链式Optional.map()的方法进行单元测试。

@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()返回一个Obj类型的Optional并且是一个私有方法。

我的测试:

@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。

我的想法是 map 将t转换为StatusDataObj类型。 因此,当 map 调用convert ,我将存根并返回我的类型。 但是,最初我期望LINE #3会有效地处理从extractSenderReference()返回的Optional上的链接map调用,因为我使用的是设置了值的真实对象,但其他地方必须有一个空值?

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

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

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

@RunWith(PowerMockRunner.class)
@PrepareForTest(StaticConverter.class, ClassBeingTested.class)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM