3 回答

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超10個(gè)贊
如前所述,不要嘗試模擬該List對(duì)象。
通常也避免為您可以簡(jiǎn)單地自己創(chuàng)建的對(duì)象創(chuàng)建模擬,并嘗試將自己限制為僅模擬依賴(lài)項(xiàng)。
測(cè)試的簡(jiǎn)化版本可能如下所示:
由于您的測(cè)試涵蓋的內(nèi)容比Unit BookService 我決定在這個(gè)例子中將其最小化。
您可能希望在針對(duì)特定實(shí)現(xiàn)的測(cè)試中執(zhí)行所有其他操作。
@Test
public void getBooksByCategory() {
List<Book> empikBestsellers = EmpikBookProvider.prepare5Bestsellers();
List<Book> merlinBestsellers = MerlinBookProvider.prepare5Bestsellers();
BookServiceSource bookServiceSource1 = Mockito.mock(BookServiceSource.class);
Mockito.when(bookServiceSource1.getName()).thenReturn(Bookstore.EMPIK);
Mockito.when(bookServiceSource1.getBooksByCategory(CategoryType.CRIME)).thenReturn(empikBestsellers);
BookServiceSource bookServiceSource2 = Mockito.mock(BookServiceSource.class);
Mockito.when(bookServiceSource2.getName()).thenReturn(Bookstore.MERLIN);
Mockito.when(bookServiceSource2.getBooksByCategory(CategoryType.CRIME)).thenReturn(merlinBestsellers);
List<BookServiceSource> sources = new ArrayList<>();
sources.add(bookServiceSource1);
sources.add(bookServiceSource2);
BookService service = new BookService(sources);
Map<Bookstore, List<Book>> actualMap = service.getBooksByCategory(CategoryType.CRIME);
// compare result
}

TA貢獻(xiàn)2012條經(jīng)驗(yàn) 獲得超12個(gè)贊
我認(rèn)為您不應(yīng)該嘲笑 BookServiceSource 列表,因?yàn)槟砑拥膬?nèi)容不會(huì)執(zhí)行任何操作,因?yàn)樗皇钦嬲牧斜怼?br />
如果可以的話(huà),不應(yīng)該使用它,它有靜默失敗的傾向。
我試圖提出的另一點(diǎn)是您正在使用模擬列表,因此當(dāng)它被告知添加元素時(shí)它不會(huì)。
您可以使用兩種解決問(wèn)題的方法。首先,您可以為 BookServiceSources 流創(chuàng)建 when thenreturn,而不是推薦的解決方案。
其次,更好的方法是創(chuàng)建一個(gè)使用 @Before 注釋創(chuàng)建 BookService 的 testSetup 方法。
@Before
public void testSetup(){
?List<BookServiceSource> list = new LinkedList<>();
?list.add(merlinSource);
?list.add(empikSource);
?bookService = new BookService(list);
}

TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊
嘗試@Spy
。它允許您注入您自己初始化的列表的實(shí)際實(shí)例,也可以部分模擬。
@Spy private?List<BookServiceSource>?sources?=?new?ArrayList<>();
似乎您為列表使用了不同的名稱(chēng),更喜歡使用注入模擬字段的 smae 名稱(chēng);消息來(lái)源。
這里有很好的解釋。
5. Mockito 中的模擬與間諜:
當(dāng) Mockito 創(chuàng)建一個(gè)模擬時(shí)——它是從一個(gè)類(lèi)型的類(lèi)中創(chuàng)建的,而不是從一個(gè)實(shí)際的實(shí)例中創(chuàng)建的。模擬只是創(chuàng)建了類(lèi)的一個(gè)基本的 shell 實(shí)例,完全用于跟蹤與它的交互。
另一方面,間諜將包裝現(xiàn)有實(shí)例。它仍將以與普通實(shí)例相同的方式運(yùn)行——唯一的區(qū)別是它還將被檢測(cè)以跟蹤與其進(jìn)行的所有交互。
添加回答
舉報(bào)