亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

PowerMockito.mockStatic() 但在調用靜態方法時仍然得到 NPE

PowerMockito.mockStatic() 但在調用靜態方法時仍然得到 NPE

Cats萌萌 2022-05-25 15:47:22
注意 - 我已經標記LINE了我在問題中討論的 3 個數字,您可能需要在代碼片段中向右滾動才能看到。我真的在努力用 chained Optional.map()s 對一個方法進行單元測試。@Overridepublic 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);@Testpublic 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()
查看完整描述

3 回答

?
森林海

TA貢獻2011條經驗 獲得超2個贊

嘗試用對StaticConverter::convert實際方法的顯式 lambda 調用替換方法引用:e -> StaticConverter.convert(e)。

我遇到了 Powermock 模擬方法引用的問題,但是通過將其保留為顯式方法調用,我可以成功地模擬這些調用。


查看完整回答
反對 回復 2022-05-25
?
尚方寶劍之說

TA貢獻1788條經驗 獲得超4個贊

您需要將類添加到@PrepareForTest您將在該測試中使用的類:


@RunWith(PowerMockRunner.class)

@PrepareForTest(StaticConverter.class, ClassBeingTested.class)

Powermock 需要知道您將在這些類中使用它。


查看完整回答
反對 回復 2022-05-25
?
鴻蒙傳說

TA貢獻1865條經驗 獲得超7個贊

Persist為空。我不確定為什么 NPE 在LINE 2.



查看完整回答
反對 回復 2022-05-25
  • 3 回答
  • 0 關注
  • 505 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號