第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

使用 Mockito.inOrder 驗(yàn)證按確切順序調(diào)用模擬方法

使用 Mockito.inOrder 驗(yàn)證按確切順序調(diào)用模擬方法

翻翻過去那場雪 2021-06-22 17:05:11
我正在嘗試測試是否按預(yù)期順序調(diào)用模擬對象上的方法。下面是一個(gè)簡化的例子:@Testpublic void test() {    List<String> mockedList = Mockito.mock(List.class);    for (int i = 0; i < 5; i++) {        mockedList.add("a");        mockedList.add("b");        mockedList.add("c");    }    // I want only this to pass.    InOrder inOrder1 = Mockito.inOrder(mockedList);    inOrder1.verify(mockedList).add("a");    inOrder1.verify(mockedList).add("b");    inOrder1.verify(mockedList).add("c");    // I want this to fail.    InOrder inOrder2 = Mockito.inOrder(mockedList);    inOrder2.verify(mockedList).add("c");    inOrder2.verify(mockedList).add("b");    inOrder2.verify(mockedList).add("a");}盡管驗(yàn)證順序 ( c -> b -> a) 與調(diào)用順序 ( a -> b -> c) 不同,但此測試通過。這是因?yàn)?Mockito 驗(yàn)證 method2 是否在method1之后的任何地方調(diào)用,但不是立即調(diào)用(即,在兩者之間沒有調(diào)用其他方法)。因?yàn)槲乙啻翁砑釉?,所以這是很有可能的。這意味著,Mockito InOrder 傳遞為b -> a -> c -> a -> c -> b -> c -> b -> a ...但我希望這失敗,并確保訂單始終是 a -> b -> c -> a -> b -> c -> a -> b -> c ...更新:正確的驗(yàn)證方法是驗(yàn)證順序相同的迭代次數(shù)(已接受答案的摘要):for (int i = 0; i < 5; i++) {    inOrder1.verify(mockedList).add("a");    inOrder1.verify(mockedList).add("b");    inOrder1.verify(mockedList).add("c");}// fail the test if we missed to verify any other invocationsinOrder1.verifyNoMoreInteractions();
查看完整描述

2 回答

?
翻過高山走不出你

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超3個(gè)贊

這里沒有答案:你走錯(cuò)了路(至少對于給定的例子):

意思是:當(dāng)你創(chuàng)建一個(gè)“API”時(shí),你要實(shí)現(xiàn)“易于使用,難以誤用”。需要按特定順序調(diào)用方法的 API 無法實(shí)現(xiàn)這一點(diǎn)。因此:感覺需要以編程方式檢查訂單可能表明您正在做“錯(cuò)誤的事情”。您應(yīng)該設(shè)計(jì)一個(gè)“做正確的事情”的 API,而不是期望您的代碼的用戶為您做這件事。

除此之外:當(dāng)您正在測試列表,你絕對希望使用擺在首位嘲諷。

您想確保元素以特定順序添加到列表中嗎?然后一個(gè)簡單的

assertThat(actualList, is(expectedList));

是您的測試應(yīng)該檢查的唯一一件事!

意思是:不是測試實(shí)現(xiàn)細(xì)節(jié)(add()使用這個(gè)和那個(gè)參數(shù),按這個(gè)和那個(gè)順序調(diào)用),你只需檢查該操作的可觀察結(jié)果。你不關(guān)心添加的順序,也許重新設(shè)置和更新,你只關(guān)心最終的結(jié)果!

鑒于 OP 的評論:當(dāng)您必須“按順序”處理某些調(diào)用/對象時(shí),您應(yīng)該設(shè)計(jì)一個(gè)允許您傳達(dá)該意圖的界面。您只是通過單元測試來測試您的意圖。這當(dāng)然是一個(gè)好的開始,但還不夠!

基本上,有兩個(gè)概念可以為您工作:

  • 序號:當(dāng)對象按順序進(jìn)入時(shí),順序很重要,那么每個(gè)對象都應(yīng)該收到一個(gè)唯一的(最好是升序的)序號。然后每個(gè)處理元素的步驟都可以簡單地記住最后處理的序列號,如果進(jìn)入的是較低的序列號,則拋出異常。

  • “命令”的序列。OP 希望確保方法調(diào)用按順序發(fā)生。這根本不是一個(gè)有用的抽象。相反:可以創(chuàng)建一個(gè)Command類(執(zhí)行“某事”),然后為每個(gè)所需的活動創(chuàng)建不同的子類。然后您的處理器只需創(chuàng)建一個(gè)List<Command>. 現(xiàn)在測試歸結(jié)為:生成這樣一個(gè)序列,并檢查每個(gè)條目是否屬于給定類型。



查看完整回答
反對 回復(fù) 2021-06-30
  • 2 回答
  • 0 關(guān)注
  • 314 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號