注意 - 我已經標記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 模擬方法引用的問題,但是通過將其保留為顯式方法調用,我可以成功地模擬這些調用。

尚方寶劍之說
TA貢獻1788條經驗 獲得超4個贊
您需要將類添加到@PrepareForTest您將在該測試中使用的類:
@RunWith(PowerMockRunner.class)
@PrepareForTest(StaticConverter.class, ClassBeingTested.class)
Powermock 需要知道您將在這些類中使用它。
添加回答
舉報
0/150
提交
取消