簡體   English   中英

測試調用另一個方法的方法

[英]Testing a method which calls another method

我的服務層中有一個方法:

  public List<String> sortBarcodesByTotalPrice(Set<String> barcodesByBookType) {
        List<String> toSort = new ArrayList<>();
        for (String barcode : barcodesByBookType) {
[1]         String combined = barcode + "/" + priceOperations.calculatePriceByBarcode(barcode);
            toSort.add(combined);
        }
[2]     toSort.sort(new TotalPriceComparator());
        return toSort;
    }

[1] 此行獲取條形碼,假設為"ABC" ,然后調用另一個 class 中的方法,該方法從數據庫中檢索有關該項目的信息,執行計算並返回價格。 可能的combined值可能類似於"ABC/10"

[2] 按價格升序對所有值進行排序。 因此,如果 List 包含"DEF/15""ABC/10" ,它將被排序為[0] = "ABC/10"[1]= "DEF/15"

當我嘗試測試此方法時, priceOperations.calculatePRiceByBarcode(barode)時出現 null 指針異常。 我如何測試這種方法? 我嘗試搜索並找到了一些關於使用 mockito 的問題和答案,但我不知道如何實現這一點。

我目前測試此方法的嘗試:

    @Test
    void sortBarcodesByTotalPrice() {
        Set<String> toSort = new HashSet<>();
        toSort.add("ABC/10");
        toSort.add("DEF/5");
        toSort.add("GHI/15");
        List<String> sorted = bookService.sortBarcodesByTotalPrice(toSort);
        assertEquals(sorted.get(0), "GHI");
        assertEquals(sorted.get(1), "ABC");
        assertEquals(sorted.get(2), "DEF");
    }

編輯,解決方案:感謝Kaj Hejer提供的信息,我已經想出了如何解決這個問題。 這是我的新測試方法,如果我理解正確的話,可以按預期通過和工作:

@Test
    void sortBarcodesByTotalPrice() {

        PriceOperations priceOperations = Mockito.mock(PriceOperations.class);

        Set<String> toSort = new HashSet<>();
        toSort.add("GHI");
        toSort.add("ABC");
        toSort.add("DEF");

        when(priceOperations.calculatePriceByBarcode("GHI")).thenReturn(new BigDecimal("15"));
        when(priceOperations.calculatePriceByBarcode("ABC")).thenReturn(new BigDecimal("10"));
        when(priceOperations.calculatePriceByBarcode("DEF")).thenReturn(new BigDecimal("5"));

        BookService bookService = new BookService(null, null, priceOperations);

        List<String> sorted = bookService.sortBarcodesByTotalPrice(toSort);
        assertEquals(sorted.get(0), "DEF/5");
        assertEquals(sorted.get(1), "ABC/10");
        assertEquals(sorted.get(2), "GHI/15");
    }

首先,您必須決定在哪里測試什么。 您可能希望對 BookService 和 PriceOperations class 進行單獨的測試。 現在您的測試正在測試這兩個類。

如果您想為 BookService class 編寫測試,您可以模擬 PriceOperations class。

List<String> sorted = new ArrayList<>();
sorted.add("GHI");
sorted.add("ABC");
sorted.add("DEF");

PriceOperations priceOperations = Mockito.mock(PriceOperations.class);
when(priceOperations. calculatePriceByBarcode(Mockito.<String>anyList())).thenReturn(sorted);

將 PriceOperations 注入 BookService 構造函數時,注入是一種聰明的注入方式,因為它使編寫測試更容易。 然后你可以注入模擬的 priceOperations

BookService bookService = new BookService(priceOperations);

請讓我知道這是否有用!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM