Tengo una clase que está anotada con @UtilityClass como esta
@UtilityClass public class myUtilClass { ... } JaCoCo no me brinda una cobertura completa para esta clase debido al código generado automáticamente creado por la anotación @UtilityClass . Idealmente, no quiero cambiar ningún archivo de configuración para ignorar el código de generación automática. ¿Cómo se puede probar este código?
El único código "cubrible" generado por @UtilityClass está en el constructor:
private MyUtilClass() { throw new UnsupportedOperationException("This is a utility class and cannot be instantiated"); } Como este es un constructor private al que nunca se debe llamar, no puede probarlo con regularidad.
Si realmente quieres llamarlo, puedes hacerlo con un código reflectante feo:
Constructor<MyUtilClass> constructor; constructor = MyUtilClass.class.getDeclaredConstructor(); constructor.setAccessible(true); constructor.newInstance();Pero no debe hacer esto solo por el bien de la cobertura. Tener una alta cobertura generalmente es una buena idea, pero no si tiene que sacrificar buenos estándares de prueba.
Le sugiero que aconseje a JaCoCo que ignore el código de Lombok agregando esta línea a su archivo lombok.config :
lombok.addLombokGeneratedAnnotation = true No tiene que configurar esto para todo su proyecto. Si coloca este archivo solo en el paquete de MyUtilClass , JaCoCo solo ignorará el código generado en este paquete.
Simplemente escriba esta prueba unitaria para asegurarse de que su clase no pueda ser instanciada debido a la anotación @UtilityClass. Entonces, la cobertura estará bien.
@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(); }); }