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

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

將元素添加到模擬列表

將元素添加到模擬列表

白衣非少年 2023-05-24 14:45:15
我正在嘗試對負責添加到地圖分類書籍的方法進行單元測試。@Servicepublic class BookService {    private final List<BookServiceSource> sources;    @Autowired    public BookService(List<BookServiceSource> sources) {        this.sources = sources;    }    public Map<Bookstore, List<Book>> getBooksByCategory(CategoryType category) {        return sources.stream()                .collect(Collectors.toMap(BookServiceSource::getName,                        source -> source.getBooksByCategory(category)));    }    }BookSerivceSource是一個接口。該接口由兩個類實現。我只提供一個,因為第二個非常相似。Jsoup連接器:package bookstore.scraper.utilities;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.springframework.stereotype.Component;import java.io.IOException;@Componentpublic class JSoupConnector {    public Document connect(String url) {        try {            return Jsoup.connect(url).get();        } catch (IOException e) {            throw new IllegalArgumentException("Cannot connect to" + url);        }    }}屬性類:package bookstore.scraper.urlproperties;import lombok.Getter;import lombok.Setter;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.stereotype.Component;@Getter@Setter@Component@ConfigurationProperties("external.library.url.empik")public class EmpikUrlProperties {    private String mostPreciseBook;    private String bestSellers;    private String concreteBook;    private String romances;    private String biographies;    private String crime;    private String guides;    private String fantasy;}在調試測試時,我看到大小sources為 0。我應該如何將模擬對象添加到源列表中,或者您能告訴我是否有更好的方法嗎?
查看完整描述

3 回答

?
不負相思意

TA貢獻1777條經驗 獲得超10個贊

如前所述,不要嘗試模擬該List對象。

通常也避免為您可以簡單地自己創建的對象創建模擬,并嘗試將自己限制為僅模擬依賴項。


測試的簡化版本可能如下所示:


由于您的測試涵蓋的內容比Unit BookService 我決定在這個例子中將其最小化。


您可能希望在針對特定實現的測試中執行所有其他操作。


@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

}


查看完整回答
反對 回復 2023-05-24
?
繁花如伊

TA貢獻2012條經驗 獲得超12個贊

我認為您不應該嘲笑 BookServiceSource 列表,因為您添加的內容不會執行任何操作,因為它不是真正的列表。

如果可以的話,不應該使用它,它有靜默失敗的傾向。

我試圖提出的另一點是您正在使用模擬列表,因此當它被告知添加元素時它不會。

您可以使用兩種解決問題的方法。首先,您可以為 BookServiceSources 流創建 when thenreturn,而不是推薦的解決方案。

其次,更好的方法是創建一個使用 @Before 注釋創建 BookService 的 testSetup 方法。

@Before

public void testSetup(){

?List<BookServiceSource> list = new LinkedList<>();

?list.add(merlinSource);

?list.add(empikSource);

?bookService = new BookService(list);

}



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

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

嘗試@Spy。它允許您注入您自己初始化的列表的實際實例,也可以部分模擬。

@Spy
private?List<BookServiceSource>?sources?=?new?ArrayList<>();

似乎您為列表使用了不同的名稱,更喜歡使用注入模擬字段的 smae 名稱;消息來源。

這里有很好的解釋。

5. Mockito 中的模擬與間諜

當 Mockito 創建一個模擬時——它是從一個類型的類中創建的,而不是從一個實際的實例中創建的。模擬只是創建了類的一個基本的 shell 實例,完全用于跟蹤與它的交互。

另一方面,間諜將包裝現有實例。它仍將以與普通實例相同的方式運行——唯一的區別是它還將被檢測以跟蹤與其進行的所有交互。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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