Коротко:
@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