Si necesita absolutamente obtener una cobertura de código del 100% - los méritos de eso se pueden debatir en otra parte :) - puede lograrlo mediante la reflexión en sus pruebas. Como hábito, cuando implemento una clase de utilidad solo estática, agrego un constructor privado para asegurar que no se puedan crear instancias de la clase. Por ejemplo:
/**
* Constructs a new MyUtilities.
* @throws InstantiationException
*/
private MyUtilities() throws InstantiationException
{
throw new InstantiationException("Instances of this type are forbidden.");
}
A continuación, la prueba podría ser algo como esto:
@Test
public void Test_Constructor_Throws_Exception() throws IllegalAccessException, InstantiationException {
final Class<?> cls = MyUtilties.class;
final Constructor<?> c = cls.getDeclaredConstructors()[0];
c.setAccessible(true);
Throwable targetException = null;
try {
c.newInstance((Object[])null);
} catch (InvocationTargetException ite) {
targetException = ite.getTargetException();
}
assertNotNull(targetException);
assertEquals(targetException.getClass(), InstantiationException.class);
}
Básicamente, lo que estamos haciendo aquí es conseguir la clase por su nombre, la búsqueda de los constructores en ese tipo de clase, el establecimiento a público (la llamada setAccessible
), invocando al constructor sin argumentos, y luego asegurando que la excepción de destino lanzada sea InstantiationException
.
De todos modos, como dijiste, el requisito de cobertura del código del 100% aquí es un poco molesto, pero parece que no está en tus manos, por lo que hay poco que puedes hacer al respecto. De hecho, he usado enfoques similares a los anteriores en mi propio código, y me pareció beneficioso, pero no desde una perspectiva de prueba. Más bien, me ayudó a aprender un poco más acerca de la reflexión de lo que sabía antes :)
El tercer enfoque es, en mi opinión, el mejor también, porque no influye en absoluto en el código (solo pruebas). Yo tomaría esto. Gracias por ayudar. –