Короче говоря:
@Spy
и @Mock
широко используются при тестировании кода, но разработчики действительно путают случаи, когда использовать один из них, и, таким образом, разработчики в конечном итоге используют их в @Mock
целях безопасности.
- Используйте,
@Mock
если вы хотите просто протестировать функциональность извне,
не вызывая этот метод.
- Используйте,
@Spy
когда вы хотите протестировать функциональность извне + внутри с помощью самого вызываемого метода.
Ниже приведен пример сценария Election20xx в Америке.
Избирателей можно разделить на VotersOfBelow21
и VotersOfABove21
.
Идеальный выход опрос говорит , что Trump выиграет выборы , потому что VotersOfBelow21
и VotersOfABove21
оба будут голосовать за козырем говоря : « Мы выбрали президента Трампа »
Но это не настоящий сценарий:
Избиратели обеих возрастных групп проголосовали за Трампа, потому что у них не было другого эффективного выбора, кроме г-на Трампа.
Так как же это проверить ??
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;
}
}
Теперь обратите внимание, что в первых двух классах выше, люди обеих возрастных групп говорят, что у них нет лучшего выбора, чем козырь. Это явно означает, что они проголосовали за Трампа только потому, что у них не было выбора.
Теперь ElectionOfYear20XX
говорится, что Трамп победил, потому что обе возрастные группы проголосовали за него подавляющим большинством.
Если бы мы протестировали с ElectionOfYear20XX
помощью @Mock, то, возможно, не смогли бы понять истинную причину победы Трампа, мы просто проверим внешнюю причину.
Если мы проверим ElectionOfYear20XX
с помощью @Spy, то по результатам внешнего экзит-опроса мы поймем настоящую причину, по которой Трамп победил, то есть внутренне + внешне.
Наши ELectionOfYear20XX_Test
класс:
@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"));
}
}
Это должно выводить только результаты логического теста, т.е. внешнюю проверку:
We elected President Trump
We elected President Trump
Тестирование с @Spy
внешней, так и с внутренней стороны с фактическим вызовом метода.
@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"));
}
}
Выход:
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