IT序号网

Mockito:在方法内部调用方法

xmjava 2024年11月24日 编程语言 41 0

里面有下面的类和方法

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(),但最好将代码重构为两个单独的类。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!