【问题标题】:Test Lombok's @UtilityClass auto-generated code测试 Lombok 的 @UtilityClass 自动生成的代码
【发布时间】:2021-03-01 21:37:25
【问题描述】:

我有一个像这样用@UtilityClass 注释的类

@UtilityClass
public class myUtilClass {
...
}

由于注释 @UtilityClass 创建的自动生成的代码,JaCoCo 没有给我这个类的完整覆盖。 理想情况下,我不想更改任何配置文件以忽略自动生成代码。如何测试这段代码?

【问题讨论】:

    标签: java testing junit lombok


    【解决方案1】:

    只需编写此单元测试以确保您的类由于@UtilityClass 注解而无法实例化。然后,覆盖范围就OK了。

    @Test
      void test_cannot_instantiate() {
        assertThrows(InvocationTargetException.class, () -> {
          var constructor = YOUR_CLASS_NAME.class.getDeclaredConstructor();
          assertTrue(Modifier.isPrivate(constructor.getModifiers()));
          constructor.setAccessible(true);
          constructor.newInstance();
        });
      }
    

    【讨论】:

      【解决方案2】:

      @UtilityClass 生成的唯一“可覆盖”代码在构造函数中:

      private MyUtilClass() {
          throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
      }
      

      由于这是一个永远不应调用的 private 构造函数,因此您无法定期对其进行测试。

      如果你真的想调用它,你可以用一些丑陋的反射代码来实现:

      Constructor<MyUtilClass> constructor;
      constructor = MyUtilClass.class.getDeclaredConstructor();
      constructor.setAccessible(true);
      constructor.newInstance();
      

      但您不应该仅仅为了报道而这样做。拥有高覆盖率通常是一个好主意,但如果您不得不牺牲良好的测试标准,那就不行了。

      我建议您建议 JaCoCo 忽略 Lombok 的代码,将此行添加到您的 lombok.config 文件中:

      lombok.addLombokGeneratedAnnotation = true
      

      您不必为整个项目进行配置。如果你只把这个文件放到MyUtilClass的包里,JaCoCo只会忽略这个包里生成的代码。

      【讨论】:

        猜你喜欢
        • 2019-10-09
        • 2010-10-25
        • 2019-06-20
        • 1970-01-01
        • 1970-01-01
        • 2010-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多