【发布时间】:2021-03-01 21:37:25
【问题描述】:
我有一个像这样用@UtilityClass 注释的类
@UtilityClass
public class myUtilClass {
...
}
由于注释 @UtilityClass 创建的自动生成的代码,JaCoCo 没有给我这个类的完整覆盖。
理想情况下,我不想更改任何配置文件以忽略自动生成代码。如何测试这段代码?
【问题讨论】:
我有一个像这样用@UtilityClass 注释的类
@UtilityClass
public class myUtilClass {
...
}
由于注释 @UtilityClass 创建的自动生成的代码,JaCoCo 没有给我这个类的完整覆盖。
理想情况下,我不想更改任何配置文件以忽略自动生成代码。如何测试这段代码?
【问题讨论】:
只需编写此单元测试以确保您的类由于@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();
});
}
【讨论】:
@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只会忽略这个包里生成的代码。
【讨论】: