gpt4 book ai didi

Mockito:在方法内部调用方法

转载 作者:行者123 更新时间:2023-12-02 07:43:37 25 4
gpt4 key购买 nike

里面有下面的类和方法

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

关于Mockito:在方法内部调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8629170/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com