自定义Comparator比较方法Jacoco代码覆盖率无法达到100%问题排查
自定义Comparator Jacoco覆盖率未达100%问题
- 已完成自定义Comparator比较器及对应单元测试编写,无论怎么调整代码都无法实现100%代码覆盖率
- 虽然未达100%覆盖率不影响代码实际使用,仍希望定位问题根因
- 已尝试Stack Overflow同类问题给出的两种解决方案:将比较器的条件判断代码拆分为多行编写、使用
&运算符替换&&运算符,两种方案均未生效
相关代码与材料
- 最初拆分多行的条件判断代码:
if (e1.getLastUpdateDateTime() == null && e2.getLastUpdateDateTime() == null) return 0;
- 单元测试方法与比较器原始实现:
@Test public void testCompare() { SomeObject m1 = new SomeObject(); m1.setSomeVariable("a"); m1.setLastUpdateDateTime(null); SomeObject m2 = new SomeObject(); m2.setSomeVariable("b"); m2.setLastUpdateDateTime(null); assertEquals(0, SomeUtil.compare(m1, m2)); m1 = new SomeObject(); m1.setSomeVariable("a"); m1.setLastUpdateDateTime(null); m2 = new SomeObject(); m2.setSomeVariable("b"); m2.setLastUpdateDateTime(getXMLGregorianCalendar("2022-01-01 00:00:02")); assertEquals(1, SomeUtil.compare(m1, m2)); m1 = new SomeObject(); m1.setSomeVariable("a"); m1.setLastUpdateDateTime(getXMLGregorianCalendar("2022-01-01 00:00:02")); m2 = new SomeObject(); m2.setSomeVariable("b"); m2.setLastUpdateDateTime(null); assertEquals(-1, SomeUtil.compare(m1, m2)); m1 = new SomeObject(); m1.setSomeVariable("a"); m1.setLastUpdateDateTime(getXMLGregorianCalendar("2022-01-01 00:00:02")); m2 = new SomeObject(); m2.setSomeVariable("b"); m2.setLastUpdateDateTime(getXMLGregorianCalendar("2022-01-01 00:00:02")); assertEquals(0, SomeUtil.compare(m1, m2)); m1 = new SomeObject(); m1.setSomeVariable("a"); m1.setLastUpdateDateTime(getXMLGregorianCalendar("2022-01-01 00:00:02")); m2 = new SomeObject(); m2.setSomeVariable("b"); m2.setLastUpdateDateTime(getXMLGregorianCalendar("2022-01-01 00:00:01")); assertEquals(-1, SomeUtil.compare(m1, m2)); List<SomeObject> SomeObjectList = TestUtil.getSomeObjectListForComparator(); SomeObject SomeObject = SomeObjectList.stream().sorted(SomeUtil::compare).findFirst().get(); assertEquals("b", SomeObject.getSomeVariable()); } public static int compare(SomeObject e1, SomeObject e2) { if (e1.getLastUpdateDateTime() == null && e2.getLastUpdateDateTime() == null) return 0; if (e1.getLastUpdateDateTime() == null && e2.getLastUpdateDateTime() != null) return 1; if (e1.getLastUpdateDateTime() != null && e2.getLastUpdateDateTime() == null) return -1; return e2.getLastUpdateDateTime().compare(e1.getLastUpdateDateTime()); }
- Jacoco代码覆盖率截图:


- 根据社区建议重写的三元运算符版本比较器:
public static int compare(SomeObject e1, SomeObject e2) { return e1.getLastUpdateDateTime() == null ? (e2.getLastUpdateDateTime() == null ? 0 : 1) : (e2.getLastUpdateDateTime() == null ? -1 : e2.getLastUpdateDateTime().compare(e1.getLastUpdateDateTime())); }
内容的提问来源于stack exchange,提问作者Sammy Pawar
相关产品推荐
相关产品推荐

