java - pildorasinformaticas - Burlarse de una clase vs. burlarse de su interfaz
programar interfaces en java (5)
Para una prueba unitaria, necesito burlarme de varias dependencias. Una de las dependencias es una clase que implementa una interfaz:
public class DataAccessImpl implements DataAccess {
...
}
Necesito configurar un objeto simulado de esta clase que devuelve algunos valores especificados cuando se proporcionan algunos parámetros especificados.
Ahora, de lo que no estoy seguro, es si es mejor burlarse de la interfaz o la clase, es decir,
DataAccess client = mock(DataAccess.class);
vs.
DataAccess client = mock(DataAccessImpl.class);
¿Hace alguna diferencia con respecto a las pruebas? ¿Cuál sería el enfoque preferido?
Deberías burlarte de la interfaz, ya que te ayudará a asegurarte de que te estás adhiriendo al Director de Substitución de Liskov ( https://.com/a/56904/3571100 ).
Depende. Si su código depende de la clase y no de la interfaz, debe burlarse de la clase para escribir una prueba de unidad válida.
En la mayoría de los casos, técnicamente no hay diferencia y puedes burlarte de clase para una interfaz. Conceptualmente, es mejor usar interfaces debido a una mejor abstracción.
Puede que no importe mucho en su caso, pero el enfoque preferido es simular la interfaz, ya que normalmente si sigue TDD (Prueba de desarrollo) entonces podría escribir las pruebas de su unidad incluso antes de escribir sus clases de implementación. Por lo tanto, incluso si no tiene una clase concreta de DataAccessImpl
, aún puede escribir pruebas de unidad usando su interfaz DataAccess
.
Además, los marcos de burla tienen limitaciones en las clases de imitación, y algunos marcos solo se burlan de las interfaces por defecto.
Si solo lo usa a través de la interfaz y no es una simulación parcial, no hay diferencia más que su sentimiento interno. Burlarse de la clase también se burlará del método público no utilizado si la clase los tiene, pero eso no es un gran problema para considerar.