如何为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
相关产品推荐
相关产品推荐

