Полагаю, не стоит переместить метод getServerName в другой класс, чтобы его можно было использовать в другом месте?Это позволит легко протестировать этот сценарий.
Как сказал Мацев, вы также пытаетесь издеваться над тестируемым классом, что является неправильной практикой.Это может быть использовано в исключительных ситуациях, как он указал, используя spy()
.Даже mockito представил эту функцию в своих более поздних выпусках, но настоятельно рекомендует пользователям ограничить использование spy()
.
Если вы переместите метод в новый класс, вы можете легко смоделировать другой класс и вернуть значениечто вам нужно.
public class A extends B implements C{
private AUtil util;
public void validateTicketGrantingTicket(final TicketGrantingTicket ticketGrantingTicket) throws InvalidTicketException {
if (ticketGrantingTicket != null)
{
String serverName = util.getServerName()
if (!ticketGrantingTicket.getHostDomain().equalsIgnoreCase(serverName))
{
throw new InvalidTicketException();
}
}
}
}
public class AUtil {
public String getServerName()
{
String serverName = "";
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
if (request != null)
{
serverName = request.getServerName().toLowerCase();
}
return serverName;
}
}
Теперь это можно считать хорошим дизайном, если мы переместим все вспомогательные функции в общий класс, из которого все классы, такие как A, могут использовать их повторно.Теперь у него отдельная забота и лучшая тестируемость.Вы можете легко издеваться над этим методом без шпиона.
public class ATest {
//cut provides a uniform naming convention-Class Under Test
private AUtil cut;
//Mock can now be created using annotations in Mockito
@Mock
AUtil mock;
@Test
public void validateTicketGrantingTicketTest() throws InvalidTicketException{
cut = new A();
ticketGrantingTicket = new
TicketGrantingTicketImpl("test",testUtils.getAuthentication(), new
NeverExpiresExpirationPolicy());
when(mock.getServerName()).thenReturn("phoenix.edu.abc");
a.validateTicketGrantingTicket(ticketGrantingTicket);
}
}