2012-02-10 24 views
31

Para una prueba de unidad, necesito burlarme de varias dependencias. Una de las dependencias es una clase que implementa una interfaz:Burlarse de una clase vs. burlarse de su interfaz

public class DataAccessImpl implements DataAccess { 
    ... 
} 

necesito para configurar un objeto de burla de esta clase que devuelve algunos valores especificados cuando se proporcionan con algunos parámetros especificados.

Ahora, lo que no estoy seguro de, es decir si es mejor para burlarse de la interfaz o la clase, es decir

DataAccess client = mock(DataAccess.class); 

vs

DataAccess client = mock(DataAccessImpl.class); 

¿Hay alguna diferencia en lo que se refiere para probar? ¿Cuál sería el enfoque preferido?

+1

Aquí hay otras ideas sobre clases de burlas. Lectura agradable, imho: http://stackoverflow.com/questions/1595166/why-is-it-so-bad-to-mock-classes – guerda

Respuesta

38

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 la clase concreta DataAccessImpl, aún puede escribir pruebas de unidad usando su interfaz DataAccess.

Por otra parte, los marcos de burla tienen limitaciones en las clases de imitación, y algunos marcos solo se burlan de las interfaces de forma predeterminada.

6

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.

+13

O escuche la prueba y haga que el código dependa de una interfaz, ya que probablemente debería. – blank

6

En la mayoría de los casos, técnicamente no hay diferencia y se puede burlar como clase para una interfaz. Conceptualmente, es mejor usar interfaces debido a una mejor abstracción.

2

Si solo lo usa a través de la interfaz y no es una simulación parcial, no hay diferencia más que su sensación interior. 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.

3

Debe burlarse de la interfaz, ya que le ayudará a asegurarse de que se adhiere a Liskov Substitution Principal (https://stackoverflow.com/a/56904/3571100).

+0

Sería interesante saber, ¿cómo se puede lograr esto burlándose de la interfaz? Puedo simular la interfaz, pero en la implementación de la clase puedo violar la sustitución de Liskov. – karlihnos

+0

@karlihnos el enlace que proporcioné indica "Las funciones [...] deben poder usar objetos de clases derivadas sin saberlo". en otras palabras, deberíamos programar para la interfaz en lugar de la implementación. Entonces, en la clase bajo prueba podemos ayudar a lograr LSP programando en la interfaz. Por supuesto, hacer esto no dice nada sobre si las implementaciones de interfaces simuladas se adherirán a LSP o no. – jordan