![](/img/trans.png)
[英]PowerMockito.mockStatic() of a static method is not working correctly in Spring Boot Test
[英]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.