unit-testing - professional - visual studio generate unit tests
Burlarse contra espiar en marcos burlones (6)
El objeto simulado reemplaza la clase simulada por completo, devolviendo valores grabados o predeterminados. Puedes crear simulacros de "aire fino". Esto es lo que se usa principalmente durante las pruebas unitarias.
Al espiar, toma un objeto existente y "reemplaza" solo algunos métodos. Esto es útil cuando tienes una gran clase y solo quieres burlar ciertos métodos (burla parcial). Permítanme citar la documentación de Mockito :
Puedes crear espías de objetos reales. Cuando utilizas el espía, se llaman a los métodos reales (a menos que se haya tropezado con un método).
Los espías reales deben usarse con cuidado y ocasionalmente , por ejemplo cuando se trata de código heredado.
En caso de duda, use burlas.
En marcos burlones, puede burlarse de un objeto o espiarlo. ¿Cuál es la diferencia entre los dos y cuándo / debería usar uno sobre el otro? En cuanto a mockito, por ejemplo, veo que se están haciendo cosas similares utilizando espías y burlas, pero no estoy seguro de la distinción entre los dos.
La burla parcial se puede lograr utilizando tanto espía como simulacro. Para el simulacro, usamos thenCallRealMethod para llamar al método real, donde como espía llama por defecto al método real. Así que ambos alcanzan el mismo objetivo de burla parcial. Sin embargo, se recomienda utilizar Spy para burlas parciales.
Cuando utilizamos Mock, la instancia del objeto real no se crea, sino que se crea una instancia de shell bare-bones de la clase para rastrear las interacciones. Mientras que en el caso de espía, nosotros mismos creamos la instancia del objeto para ser utilizada por espía. Entonces, usar Mockito Spy garantiza que los métodos reales se llaman correctamente.
Por ejemplo-
public class EmployeePaymentService {
EmployeePaymentService(
final NamedParameterJdbcTemplate namedParameterJdbcTemplate)
{
this.namedParameterJdbcTemplate = namedParameterJdbcTemplate;
}
public int getNoOfWorkingDays(String empId)
{
//call some query
int days=namedParameterJdbcTemplate.query();
return days;
}
}
Si para un caso de prueba de unidad nos burlamos parcialmente del EmployeePaymentService anterior usando Mock as-
@Mock private EmployeePaymentService employeePaymentService;
y luego llama al método real getNoOfWorkingDays usando thenCallRealMethod de la siguiente manera-
when(employeePaymentService.getNoOfWorkingDays(anyString())).thenCallRealMethod();
int returnedWrkingDays = employeePaymentService.getNoOfWorkingDays(empId);
Obtenemos una java.lang.NullPointerException en el método getNoOfWorkingDays porque namedParameterJdbcTemplate nunca se ha inicializado. Sin embargo, si utilizáramos Mockito Spy, este escenario nunca surgiría porque habríamos creado EmployeePaymentService usando constructor con namedJdbcTemplate.
Para más detalles verifique esta post
Los espías tienen dos definiciones. Uno, es donde se llama el método real, otro donde no se llama funcionalidad y solo se devuelven valores equivalentes nulos o nulos, pero se invocaron métodos, y se registraron estados, comúnmente como, el método x se llamó y veces.
Mockito advierte que la burla parcial no es una buena práctica y debe revisar su arquitectura OO. Se recomienda espiar (o burlarse parcialmente) para probar el código heredado.
Puede intentar explicar usando el ejemplo aquí.
// difference between mocking, stubbing and spying
@Test
public void differenceBetweenMockingSpyingAndStubbing(){
List list = new ArrayList();
list.add("abc");
assertEquals(1,list.size());
List mockedList = spy(list);
when(mockedList.size()).thenReturn(10);
assertEquals(10,mockedList.size());
}
Aquí, teníamos una lista de objetos real inicial, en la que agregamos un elemento y el tamaño esperado para que fuera uno.
Espiamos un objeto real, lo que significa que podemos instruir qué método se va a pisar. así que declaramos que pegamos el método - size () en el objeto espía que devolverá 10, sin importar el tamaño real.
en resumen, espiarás el objeto real y algunos de los métodos.
Referencia: http://javapointers.com/tutorial/difference-between-spy-and-mock-in-mockito/
Cuando se utilizan objetos simulados, el comportamiento predeterminado del método cuando no es un código auxiliar no hace nada. Simple significa, si es un método nulo, entonces no hará nada cuando llame al método o si es un método con un retorno, entonces puede devolver nulo, vacío o el valor predeterminado.
Mientras que en los objetos espía, por supuesto, dado que es un método real, cuando no está cortando el método, llamará al comportamiento del método real. Si desea cambiar y burlarse del método, entonces necesita trozo.