You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 21:29:58