如何为Comparator.comparing编写JUnit测试?测试执行失败
如何正确测试基于价格的Product列表Comparator
你的测试失败的原因
语法错误:测试代码存在两处语法问题,会导致编译或运行异常:
- 测试方法定义缺少括号:
public void getComparisonProducts{应改为public void getComparisonProducts() { - 两个
add语句末尾缺少分号:productsList.add(product)和productsList.add(product2)都需要补充;
- 测试方法定义缺少括号:
测试逻辑不合理:你通过断言
comparator.compare(productsList.get(0), productsList.get(1)) == -1验证排序结果,这是在重复验证Comparator的内部逻辑,而非直接验证排序后的列表是否符合预期。更合理的方式是直接检查排序后元素的价格顺序是否符合升序要求。
修正后的测试代码
方式一:验证排序后的列表顺序(推荐)
这种方式直接验证排序结果是否符合业务预期,更贴合测试的核心目的:
@Test public void testProductSortByPriceAsc() { // 准备测试数据 List<Product> productsList = new ArrayList<>(); Product product1 = new Product(); product1.setPrice(11.22); productsList.add(product1); Product product2 = new Product(); product2.setPrice(22.11); productsList.add(product2); // 执行排序 Comparator<Product> comparator = Comparator.comparing(Product::getPrice); productsList.sort(comparator); // 断言排序结果:第一个元素价格更小,第二个更大 assertEquals(11.22, productsList.get(0).getPrice(), 0.001); // 用delta处理浮点数精度问题 assertEquals(22.11, productsList.get(1).getPrice(), 0.001); }
注意:由于浮点数存在精度误差,断言时需要加上delta参数(比如0.001),避免因微小精度差异导致测试失败。
方式二:直接测试Comparator的逻辑
如果想单独验证Comparator的正确性,可以直接调用它的compare方法:
@Test public void testProductPriceComparator() { Product product1 = new Product(); product1.setPrice(11.22); Product product2 = new Product(); product2.setPrice(22.11); Product product3 = new Product(); product3.setPrice(11.22); Comparator<Product> comparator = Comparator.comparing(Product::getPrice); // 验证升序逻辑:小值在前返回负数 assertTrue(comparator.compare(product1, product2) < 0); // 大值在前返回正数 assertTrue(comparator.compare(product2, product1) > 0); // 相等值返回0 assertEquals(0, comparator.compare(product1, product3)); }
用范围判断正负比直接断言等于-1更稳妥,能兼容更多Comparator实现的返回逻辑。
内容的提问来源于stack exchange,提问作者cassioliveira
相关产品推荐
相关产品推荐

