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

如何为Lombok注解编写测试用例?测试覆盖率偏低求优化方案

解决Lombok注解类测试覆盖率低的问题

你当前的测试只覆盖了@NoArgsConstructor生成的无参构造,以及@Data生成的部分setter/getter方法,但Lombok还为ABC类生成了全参构造、equals、hashCode、toString这些方法,这些未被测试覆盖才导致整体覆盖率低。

要拉满覆盖率,需要把Lombok生成的所有方法都纳入测试范围,以下是完整的测试用例:

import org.junit.Test;
import static org.junit.Assert.*;

public class ABCTest {

    // 测试无参构造 + setter/getter
    @Test
    public void testNoArgsConstructorAndSettersGetters() {
        ABC abc = new ABC();
        
        // 设置字段值
        abc.setStatus("SUCCESS");
        abc.setErrorCode("000");
        abc.setMessage("操作成功");
        abc.setId("ID123");
        abc.setOrderNumber(456L);
        abc.setLineId(78L);
        
        // 验证字段值
        assertNotNull(abc);
        assertEquals("SUCCESS", abc.getStatus());
        assertEquals("000", abc.getErrorCode());
        assertEquals("操作成功", abc.getMessage());
        assertEquals("ID123", abc.getId());
        assertEquals(456L, abc.getOrderNumber().longValue());
        assertEquals(78L, abc.getLineId().longValue());
    }

    // 测试全参构造方法
    @Test
    public void testAllArgsConstructor() {
        String status = "FAILED";
        String errorCode = "999";
        String message = "操作失败";
        String id = "ID456";
        Long orderNumber = 1001L;
        Long lineId = 200L;
        
        ABC abc = new ABC(status, errorCode, message, id, orderNumber, lineId);
        
        // 验证全参构造赋值正确
        assertEquals(status, abc.getStatus());
        assertEquals(errorCode, abc.getErrorCode());
        assertEquals(message, abc.getMessage());
        assertEquals(id, abc.getId());
        assertEquals(orderNumber, abc.getOrderNumber());
        assertEquals(lineId, abc.getLineId());
    }

    // 测试equals和hashCode方法
    @Test
    public void testEqualsAndHashCode() {
        ABC abc1 = new ABC("SUCCESS", "000", "操作成功", "ID123", 456L, 78L);
        ABC abc2 = new ABC("SUCCESS", "000", "操作成功", "ID123", 456L, 78L);
        ABC abc3 = new ABC("FAILED", "999", "操作失败", "ID456", 1001L, 200L);
        
        // 相同字段的对象应该相等,hashCode相同
        assertEquals(abc1, abc2);
        assertEquals(abc1.hashCode(), abc2.hashCode());
        
        // 不同字段的对象应该不相等,hashCode不同
        assertNotEquals(abc1, abc3);
        assertNotEquals(abc1.hashCode(), abc3.hashCode());
        
        // 测试和null比较
        assertNotEquals(abc1, null);
        // 测试和不同类型对象比较
        assertNotEquals(abc1, new Object());
    }

    // 测试toString方法
    @Test
    public void testToString() {
        ABC abc = new ABC("SUCCESS", "000", "操作成功", "ID123", 456L, 78L);
        String toStringResult = abc.toString();
        
        // 验证toString包含所有字段的关键信息
        assertTrue(toStringResult.contains("status=SUCCESS"));
        assertTrue(toStringResult.contains("errorCode=000"));
        assertTrue(toStringResult.contains("message=操作成功"));
        assertTrue(toStringResult.contains("id=ID123"));
        assertTrue(toStringResult.contains("orderNumber=456"));
        assertTrue(toStringResult.contains("lineId=78"));
    }
}

为什么这样能提升覆盖率?

Lombok的@Data注解会自动生成以下方法:

  • 所有字段的getter/setter
  • equals(Object)
  • hashCode()
  • toString()
    加上@NoArgsConstructor和@AllArgsConstructor生成的两个构造方法,上面的测试用例覆盖了所有这些自动生成的方法,自然就能把代码覆盖率拉满。

内容的提问来源于stack exchange,提问作者Praveen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 10:00:28