如何测试调用外部类方法的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
相关产品推荐
相关产品推荐

