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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 00:17:19