猿问

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

注意 - 我已经标记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()


Cats萌萌
浏览 531回答 3
3回答

森林海

尝试用对StaticConverter::convert实际方法的显式 lambda 调用替换方法引用:e -> StaticConverter.convert(e)。我遇到了 Powermock 模拟方法引用的问题,但是通过将其保留为显式方法调用,我可以成功地模拟这些调用。

尚方宝剑之说

您需要将类添加到@PrepareForTest您将在该测试中使用的类:@RunWith(PowerMockRunner.class)@PrepareForTest(StaticConverter.class, ClassBeingTested.class)Powermock 需要知道您将在这些类中使用它。

鸿蒙传说

Persist为空。我不确定为什么 NPE 在LINE 2.
随时随地看视频慕课网APP

相关分类

Java
我要回答