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

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

模擬一個返回 Stream 并被多次調用的方法

模擬一個返回 Stream 并被多次調用的方法

江戶川亂折騰 2022-06-15 16:53:08
MyStreamClass mock = mock(MyStreamClass.class);when(mock.streamMethod()).thenReturn(Stream.of("A", "B"));System.out.println(""+mock.streamMethod().findFirst());System.out.println(""+mock.streamMethod().findFirst());findFirst 的第二次調用將拋出 java.lang.IllegalStateException: stream has already been operating on or closed
查看完整描述

4 回答

?
倚天杖

TA貢獻1828條經驗 獲得超3個贊

嘗試thenAnswer代替thenReturn:


Answer<Stream> answer = new Answer<Stream>() {

    public Stream answer(InvocationOnMock invocation) throws Throwable {

        return Stream.of("A", "B");

    }

};



when(mock.streamMethod()).thenAnswer(answer);

現在將為每次調用創建一個新的 Stream streamMethod。


進一步閱讀:


這是我在 Mockito中寫的一篇關于動態回答的文章,可能是互補的。


查看完整回答
反對 回復 2022-06-15
?
炎炎設計

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

您不是在模擬 Stream,而是在創建一個 - 而且只有一個,它將在調用第一個終止方法后被消耗,這就是您所經歷的。


在大多數情況下,最好盡可能堅持嘲笑,就您而言


MyStreamClass mock = mock(MyStreamClass.class);

Stream mockStream = mock(Stream.class);

when(mock.streamMethod()).thenReturn(mockStream);

這應該足以測試所有客戶端MyStreamClass- 從流中獲取實際結果是沒有意義的。


如果這不適合您的設計,您也可以使用Answer:


when(mock.streamMethod()).then(i -> Stream.of("A", "B"));

這將導致每次調用該方法時都會創建流。


或者,您可以使用 模擬多個調用thenReturn()。


when(mock.streamMethod()).thenReturn(Stream.of("A", "B"), Stream.of("A", "B"));

這將持續你 2 個電話。


查看完整回答
反對 回復 2022-06-15
?
波斯汪

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

嘗試 thenAnswer 使用 Java 8 方法

when(mock.streamMethod()).thenAnswer(invocation -> Stream.of("A", "B"))


查看完整回答
反對 回復 2022-06-15
?
茅侃侃

TA貢獻1842條經驗 獲得超22個贊

嘗試這個:


MyStreamClass mock = Mockito.mock(MyStreamClass.class);


Mockito.when(mock.streamMethod()).thenReturn(Stream.of("A", "B"));

Stream s = mock.streamMethod();


s.forEach(System.out::println);


查看完整回答
反對 回復 2022-06-15
  • 4 回答
  • 0 關注
  • 187 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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