如何让JUnit测试对Lombok@Data/@NoArgsConstructor类实现100%分支覆盖率?
如何让JUnit测试覆盖Lombok注解生成的代码以达到100%分支覆盖率
我希望JUnit测试能够对实体类实现100%的分支覆盖率,但当前编写的测试无法覆盖@Data和@NoArgsConstructor注解生成的代码。
实体类代码
@NoArgsConstructor @Data public class MyDetailsEntity extends Entity { private String myDetailsIdentifier; private String approvedDetailsIdentifier; }
现有JUnit测试代码
public class MyDetailsEntityTest { @Test public void testNoArgsConstructor() { // Explicitly testing the no-args constructor MyDetailsEntity entity = new MyDetailsEntity(); assertNotNull(entity); } @Test public void testLombokGeneratedMethods() { MyDetailsEntity entity1 = new MyDetailsEntity(); entity1.setMyDetailsIdentifier("UL123"); entity1.setApprovedApplicationIdentifier("APP123"); // Validate getters assertEquals("UL123", entity1.getMyDetailsIdentifier()); assertEquals("APP123", entity1.getApprovedDetailsIdentifier()); // Test equals and hashCode MyDetailsEntity entity2 = new MyDetailsEntity(); entity2.setMyDetailsIdentifier("UL123"); entity2.setApprovedApplicationIdentifier("APP123"); assertEquals(entity1, entity2); assertEquals(entity1.hashCode(), entity2.hashCode()); // Test equals with itself assertEquals(entity1, entity1); // Test equals with null assertNotEquals(entity1, null); // Test equals with a different class assertNotEquals(entity1, new Object()); // Test hashCode with null fields assertNotEquals(entity1.hashCode(), entity3.hashCode()); assertEquals(entity3.hashCode(), entity3.hashCode()); // Test toString for null and non-null values assertNotNull(entity1.toString()); assertNotNull(entity3.toString()); assertTrue(entity1.toString().contains("UL123")); assertFalse(entity3.toString().contains("UL123")); } }
需要补充的测试内容
修复未定义变量问题:当前测试中的
entity3未初始化,必须先创建实例(MyDetailsEntity entity3 = new MyDetailsEntity();),否则测试无法正常执行,更无法覆盖相关分支。覆盖equals方法的全部分支:
- 测试对象间部分字段匹配、部分不匹配的场景:比如创建
entity2时只设置myDetailsIdentifier为"UL123",approvedDetailsIdentifier留空,验证entity1与entity2不相等,且两者hashCode不同。 - 若父类
Entity包含字段,需测试父类字段差异对子类equals和hashCode的影响:比如父类有id字段,设置两个子类对象的父类id不同,验证它们不相等。
- 测试对象间部分字段匹配、部分不匹配的场景:比如创建
覆盖setter的null值场景:
- 测试给字段设置
null,验证getter能正确返回null:比如entity1.setMyDetailsIdentifier(null);,随后断言assertNull(entity1.getMyDetailsIdentifier());。
- 测试给字段设置
覆盖toString的全场景:
- 测试所有字段为null的情况,确认toString输出包含字段名和null标识;同时测试部分字段null、部分非null的场景,确保每个字段的状态都被覆盖到。
覆盖hashCode的边界场景:
- 测试所有字段为null时的hashCode值,以及与部分字段非null的对象hashCode对比,确保不同状态下hashCode不同。
测试Lombok生成的canEqual方法:
- 若父类存在,
@Data会生成canEqual方法,需显式测试:调用entity1.canEqual(new Entity())断言返回false,调用entity1.canEqual(entity2)断言返回true。
- 若父类存在,
内容的提问来源于stack exchange,提问作者user222
相关产品推荐
相关产品推荐

