En breve:
@Spy
y @Mock
se utilizan mucho en las pruebas de código, pero los desarrolladores confunden en los casos en que usar uno de ellos y, por lo tanto, los desarrolladores terminan usándolo @Mock
para estar seguros.
- Úselo
@Mock
cuando desee probar la funcionalidad externamente
sin llamar a ese método.
- Úselo
@Spy
cuando desee probar la funcionalidad externamente + internamente con el mismo método al que se llama.
A continuación se muestra el ejemplo en el que he tomado el escenario de Election20xx en Estados Unidos.
Los votantes se pueden dividir según VotersOfBelow21
y VotersOfABove21
.
La encuesta de salida ideales Trump dice que va a ganar las elecciones porque VotersOfBelow21
, y VotersOfABove21
ambos van a votar por decir de triunfo " Hemos elegido Presidente de Trump "
Pero este no es el escenario real:
Los votantes de ambos grupos de edad votaron por Trump porque no tenían otra opción efectiva que no fuera Trump.
Entonces, ¿cómo se prueba?
public class VotersOfAbove21 {
public void weElected(String myVote){
System.out.println("Voters of above 21 has no Choice Than Thrump in 20XX ");
}
}
public class VotersOfBelow21 {
public void weElected(String myVote){
System.out.println("Voters of below 21 has no Choice Than Thrump in 20XX");
}
}
public class ElectionOfYear20XX {
VotersOfAbove21 votersOfAbove21;
VotersOfBelow21 votersOfBelow21;
public boolean weElected(String WeElectedTrump){
votersOfAbove21.weElected(WeElectedTrump);
System.out.println("We elected President Trump ");
votersOfBelow21.weElected(WeElectedTrump);
System.out.println("We elected President Trump ");
return true;
}
}
Ahora tenga en cuenta que en las dos primeras clases anteriores, las personas del grupo de edad dicen que no tienen una mejor opción que Trump. Lo que significa explícitamente que votaron por Trump solo porque no tenían otra opción.
Ahora ElectionOfYear20XX
dice que Trump ganó porque ambos grupos de edad votaron por él de manera abrumadora.
Si probamos el ElectionOfYear20XX
con @Mock, entonces es posible que no podamos obtener la verdadera razón por la que Trump ganó, solo probaremos la razón externa.
Si probamos ElectionOfYear20XX
con @Spy, obtenemos la verdadera razón por la que Trump ganó con los resultados de la encuesta de salida externa, es decir, internamente + externamente.
Nuestra ELectionOfYear20XX_Test
clase:
@RunWith(MockitoJUnitRunner.class)
public class ELectionOfYear20XX_Test {
@Mock
VotersOfBelow21 votersOfBelow21;
@Mock
VotersOfAbove21 votersOfAbove21;
@InjectMocks
ElectionOfYear20XX electionOfYear20XX;
@Test
public void testElectionResults(){
Assert.assertEquals(true,electionOfYear20XX.weElected("No Choice"));
}
}
Esto debería generar solo los resultados de la prueba lógica, es decir, la verificación externa:
We elected President Trump
We elected President Trump
Pruebas tanto @Spy
externas como internas con la invocación del método real.
@RunWith(MockitoJUnitRunner.class)
public class ELectionOfYear20XX_Test {
@Spy
VotersOfBelow21 votersOfBelow21;
@Spy
VotersOfAbove21 votersOfAbove21;
@InjectMocks
ElectionOfYear20XX electionOfYear20XX;
@Test
public void testElectionResults(){
Assert.assertEquals(true,electionOfYear20XX.weElected("No Choice"));
}
}
Salida:
Voters of above 21 has no Choice Than Thrump in 20XX
We elected President Trump
Voters of below 21 has no Choice Than Thrump in 20XX
We elected President Trump