Todos tenemos algunas clases de utilidad, que contienen solo métodos estáticos, para usar desde diferentes fuentes. Ahora, puede haber dos enfoques que se pueden tomar para probar este fragmento de código.
Enfoque 1:
Tener pruebas unitarias separadas para clases de utilidad. Dondequiera que se les llame, simule su interacción utilizando algún marco de prueba que tenga provisiones para ello, como PowerMock. Básicamente, esto trata la clase de utilidad como un componente separado del sistema, que debe probarse y mantenerse individualmente.
Enfoque 2:
No escriba pruebas unitarias para clases de utilidad. Sin embargo, las pruebas que se escriben para sus otras clases principales que interactúan con esta clase de utilidad, permiten que ocurra esa interacción, lo que garantizará intrínsecamente que el código escrito en esta clase de utilidad se pruebe adecuadamente para diferentes casos de uso. Si algo se rompe, las pruebas para otros componentes deberían poder atraparlo.
Comparta sus ideas sobre qué enfoque es preferible, o si hay alguna otra forma en que las personas aborden esto.
Respuestas:
Creo que hay un gran malentendido sobre las clases de 'utilidad' por ahí. El hecho de que haga una clase 'estática' no la convierte en una clase de utilidad. Si su clase de utilidad estática tiene dependencias (que pueden manifestarse en otras clases de 'utilidad' estáticas), introduce efectos secundarios o su comportamiento no puede ser completamente controlado por sus entradas, no es una clase de utilidad.
No es necesario burlarse de las verdaderas clases de utilidad porque su salida siempre es determinista dependiendo de sus entradas.
La prueba de unidad consiste en crear una instancia de una pequeña parte de su aplicación (una unidad) de forma aislada para que pueda (potencialmente) probar todas las rutas de código dentro de esa unidad. Las burlas de las dependencias logran este aislamiento. Si una clase de utilidad rompe el aislamiento, nuevamente no es una clase de utilidad porque se supone que una clase de utilidad está aislada por definición.
Entonces, en una aplicación, uno nunca debería querer o tener que burlarse de las clases de utilidad. Las clases que usted cree que deben burlarse deben convertirse en clases instanciables de primera clase y deben pasar a la unidad como una dependencia (consulte Inyección de dependencias ). Estas dependencias se pueden burlar fácilmente para que la unidad se pueda probar de forma aislada.
fuente
En mi opinión, es ridículo burlarse de una dependencia de un método de utilidad estática para cosas como la división de cadenas.
Sí, si el método de división es incorrecto, puede causar fallas falsas en las pruebas de métodos que no se tratan de división de cadenas. Pero ese no es el objetivo de un conjunto de pruebas. El conjunto de pruebas debe tener éxito al 100%, punto. Si no lo hace, arregla lo que está roto y repite hasta que tenga éxito al 100%. Si la clase de utilidad de cadena se rompe, inmediatamente debería causar una falla en una prueba que trata sobre la funcionalidad de la cadena. Corrige esa funcionalidad y luego desaparecen todas las fallas, por lo que nunca tiene que mirar los casos de prueba falsamente espurios.
En otras palabras, SÍ, escriba pruebas para métodos de utilidad. NO, no intentes desacoplarlos de otras pruebas. Simplemente suponga que las funciones de utilidad triviales funcionan correctamente, como lo verifican sus propias pruebas. Hacer algo más es más esfuerzo sin ganancia alguna.
fuente