里面有下面的类和方法
public class A extends B implements C{
public void validateTicketGrantingTicket(final TicketGrantingTicket ticketGrantingTicket) throws InvalidTicketException {
if (ticketGrantingTicket != null)
{
if (!ticketGrantingTicket.getHostDomain().equalsIgnoreCase(getServerName()))
{
throw new InvalidTicketException();
}
}
}
public String getServerName()
{
String serverName = "";
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
if (request != null)
{
serverName = request.getServerName().toLowerCase();
}
return serverName;
}
}
现在我在写ATest类和mock类A。
public class ATest {
private A a;
@Before
public void init(){
A = mock(A.class);
when(A.getServerName()).thenReturn("phoenix.edu.abc");
}
@Test
public void validateTicketGrantingTicketTest() throws InvalidTicketException{
a = new A();
ticketGrantingTicket = new
TicketGrantingTicketImpl("test",testUtils.getAuthentication(), new
NeverExpiresExpirationPolicy());
a.validateTicketGrantingTicket(ticketGrantingTicket);
}
模拟对象给我 getServerName() 方法的空指针异常,而不是字符串“phoenix.edu.abc”
请您参考如下方法:
通过在测试方法中调用 a = new A();
,您可以创建 A 的新实例以及对在 init() 中创建的模拟 A 实例的引用
方法将丢失。因此,将调用 A 的 getServerName()
方法的“真实”实现,而不是您模拟的那个。
您遇到的另一个问题是您试图同时模拟和测试同一个类。一方面,您正在测试 validateTicketGrantingTicket()
,但同时您正在模拟 getServerName()
。您可以使用 spy() 解决这个问题而不是 mock()
,但最好将代码重构为两个单独的类。