编写JUnit测试覆盖Stream多过滤条件以满足SonarQube代码覆盖率
针对Stream过滤条件的JUnit覆盖率解决方案
核心思路
无需复杂Mock,直接构造实体对象(或简单Stub),分别覆盖三个场景,确保每个条件分支都被执行。
具体实现步骤
场景1:命中
salary == 1000的条件
构造salary为1000的实体对象,放入待处理集合,执行Stream过滤后断言结果包含该对象。示例代码:@Test void testFilterSalary1000() { List<Record> records = List.of(new Record(1000)); // 假设实体类构造方法支持传入salary List<Record> filtered = records.stream() .filter(r -> r.salary() == 1000 || r.salary() == 2000) .collect(Collectors.toList()); assertEquals(1, filtered.size()); assertEquals(1000, filtered.get(0).salary()); }场景2:命中
salary == 2000的条件
构造salary为2000的实体对象,执行过滤后断言结果正确。示例代码:@Test void testFilterSalary2000() { List<Record> records = List.of(new Record(2000)); List<Record> filtered = records.stream() .filter(r -> r.salary() == 1000 || r.salary() == 2000) .collect(Collectors.toList()); assertEquals(1, filtered.size()); assertEquals(2000, filtered.get(0).salary()); }场景3:不满足任何过滤条件
构造salary为其他值(如3000)的实体对象,执行过滤后断言结果为空集合。示例代码:@Test void testFilterNoMatch() { List<Record> records = List.of(new Record(3000)); List<Record> filtered = records.stream() .filter(r -> r.salary() == 1000 || r.salary() == 2000) .collect(Collectors.toList()); assertTrue(filtered.isEmpty()); }
依赖外部服务时的适配方案
如果业务代码依赖DAO/服务获取待处理集合,可通过Mock工具(如Mockito)让依赖返回单一场景的集合,分三次测试覆盖所有分支:
@Mock private RecordDao recordDao; @Test void testFilterSalary1000() { when(recordDao.getAllRecords()).thenReturn(List.of(new Record(1000))); List<Record> result = yourBusinessService.filterTargetRecords(); // 业务方法 assertEquals(1, result.size()); }
内容的提问来源于stack exchange,提问作者Vinit More
相关产品推荐
相关产品推荐

