2010-09-27 11 views
8

¿Por qué hay tanto odio sobre 'burlas parciales' y el código que lo requiere?burla parcial como olor a código?

Aquí es una implementación (teórico) ejemplo:

public ComplexResult1 operationA(Stimulus a) { 
    { 
     ... 
     result = ...; 
    } 
    auditTheChange(a); 
} 
public ComplexResult2 operationB(Stimulus b) { 
    { 
     ... 
     result = ...; 
    } 
    auditTheChange(b); 
    return result; 
} 
void auditTheChange(Stimulus stim) { 
    // do a bunch of stuff to record the change 
    // and interact with another outside service 
} 

Ahora, en mi entender esto es así refactorizado código.

Si deseo de probar la unidad OPERATIVO y operationB, y asegurar que la auditoría que sucede en cada escenario, pero sin tener que probar las características específicas del código de auditoría, me gustaría utilizar burla parcial.

¿Qué no estoy viendo/entendiendo que causa tantos proyectos (EasyMock, Mockito, etc.) para recomendar la refactorización?

+0

¿Quién es el que hace declaraciones generales contra el uso de simulacros parciales? –

+0

Es un uso bastante injustificado de la palabra "odiar" – skaffman

+0

@kirk, de la documentación de EasyMock: "En este caso, lo primero que hay que hacer es considerar una refactorización ya que la mayoría de las veces este problema se debe a un diseño incorrecto. no es el caso o si no puede hacerlo de otra forma debido a algunas limitaciones de desarrollo, aquí está la solución ". – Nelz

Respuesta

4

Si la auditoría es realmente una función interna de la clase, entonces el código debe probarse como parte de la prueba de la unidad. ¿Por qué su clase maneja operaciones complejas y auditoría? ¿Se podría mover la auditoría a una clase separada?

En caso afirmativo, presente la auditoría como colaborador de esta clase y protéjala. Si no, prueba la unidad.

Puede usar simulaciones parciales, pero en este caso creo que es una indicación de que la clase está haciendo demasiado.

+0

Un caso de uso válido podría ser si todos los métodos públicos llaman algún tipo de limpieza() al final de ellos. En este caso, puede escribir una prueba de unidad para cleanUp(), en sí mismo. Luego, al probar todos los métodos públicos, use un simulacro parcial para simplemente verificar que se llamó cleanUp() evitando la necesidad de verificar los detalles de lo que cleanUp() hizo en cada método público. –

Cuestiones relacionadas