You need to enable JavaScript to run this app. 如何测试调用外部类方法的Java服务方法?用Mockito解决测试空指针异常
优惠活动
大模型
产品
解决方案
定价
更多

如何测试调用外部类方法的Java服务方法?用Mockito解决测试空指针异常

解决 sortBarcodesByTotalPrice 测试时的 NullPointerException

被测业务方法代码

服务层定义的方法如下:

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)后,调用priceOperations类的方法,该方法会从数据库查询商品信息、完成价格计算后返回结果,拼接得到的字符串格式类似ABC/10。
  • [2]行:对所有拼接后的字符串按价格升序排序,例如列表存在DEF/15和ABC/10时,排序后索引0为ABC/10、索引1为DEF/15。

测试遇到的问题

执行该方法的测试时,调用priceOperations.calculatePriceByBarcode(barcode)的过程中抛出NullPointerException,已知可以通过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");
}

可正常运行的测试实现

通过Mockito mock依赖后的测试代码如下,运行可正常通过且符合预期:

@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");
}

内容的提问来源于stack exchange,提问作者Kleronomas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.28 01:36:10