如何使用Assertions或Mocks为该Java方法编写单元测试?
你的Java代码单元测试验证方案
核心测试场景拆解
你的代码分两个关键分支,单元测试必须覆盖这两个场景,才能确保逻辑正确:
- 分支一:
cantidad = 0(也就是mapsCodigoError里的HashMap是空的) - 分支二:
cantidad ≠ 0(HashMap有数据,触发遍历、转换、排序、添加元素的完整逻辑)
具体测试实现步骤
1. 准备测试工具
通常用JUnit 5 + Mockito来做这类测试,先在测试类里mock好依赖对象:
- Mock
mapsCodigoError,控制它返回的HashMap内容 - 如果
recuperarError是外部方法或需要验证调用,也可以mock它的返回值
2. 测试分支一:空HashMap场景
测试目标:当HashMap为空时,listaValoresEstatus保持初始状态(比如空列表)
@Test void testWhenHashMapIsEmpty() { // 1. 设置mock:让mapsCodigoError返回空HashMap when(mapsCodigoError.getHaspMapCodigos()).thenReturn(new HashMap<>()); // 2. 调用你要测试的方法(假设这段代码在processCodigos()里) yourClassInstance.processCodigos(); // 3. 验证结果:listaValoresEstatus应该是空的 assertTrue(listaValoresEstatus.isEmpty()); }
3. 测试分支二:非空HashMap场景
这个分支要验证多个关键环节:recuperarError的调用、列表排序、元素正确添加到listaValoresEstatus
3.1 先造测试数据
// 构造测试用的Totalcodigo对象 Totalcodigo errorCode1 = new Totalcodigo("ERROR_TYPE_1"); Totalcodigo errorCode2 = new Totalcodigo("ERROR_TYPE_2"); // 构造带数据的HashMap HashMap<Totalcodigo, Integer> testHashMap = new HashMap<>(); testHashMap.put(errorCode1, 5); testHashMap.put(errorCode2, 3); // 模拟recuperarError的返回结果:注意顺序要和排序后的预期一致(假设按数值升序排) ValorCodigoOrdenado sortedValor1 = new ValorCodigoOrdenado(errorCode2, 3); ValorCodigoOrdenado sortedValor2 = new ValorCodigoOrdenado(errorCode1, 5); List<ValorCodigoOrdenado> mockRecuperarResult = Arrays.asList(sortedValor1, sortedValor2);
3.2 编写测试用例
@Test void testWhenHashMapHasData() { // 1. 设置mock when(mapsCodigoError.getHaspMapCodigos()).thenReturn(testHashMap); when(yourClassInstance.recuperarError(any(Iterator.class), any(List.class))).thenReturn(mockRecuperarResult); // 2. 调用测试方法 yourClassInstance.processCodigos(); // 3. 验证关键逻辑 // 确认recuperarError被调用了一次 verify(yourClassInstance, times(1)).recuperarError(any(Iterator.class), any(List.class)); // 验证listaValoresEstatus的元素数量正确 assertEquals(2, listaValoresEstatus.size()); // 验证元素是排序后的结果(这里按数值升序,所以第一个是3,第二个是5) assertEquals(sortedValor1, listaValoresEstatus.get(0)); assertEquals(sortedValor2, listaValoresEstatus.get(1)); }
4. 修正你当前的校验方式
你用assertNotNull(cantidad)没意义,因为size()返回的是int类型,永远不会为null。直接校验数值就行:
// 分支一的校验 assertEquals(0, yourClassInstance.getCantidad()); // 分支二的校验 assertEquals(2, yourClassInstance.getCantidad());
内容的提问来源于stack exchange,提问作者Luis García
相关产品推荐
相关产品推荐

