Mockito:在方法内部调用方法

标签 mockito

里面有下面的类和方法

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/

相关文章:

java - 模拟空对象而不传递它们

android - RxJava+Retrofit 2单元测试怪异错误

java - 模拟方法,但它调用实际方法

java - 验证对静态方法的调用

java - 使用 MockBean 清理 Spring Context 缓存失败 loadLibrary

java - 使用@Slf4j 注释创建时如何模拟 Logger?

java - 在测试中使用@MockBean 会强制重新加载应用程序上下文

java - 使用静态工厂方法创建的对象的模拟行为

java - 需要使用mockito测试apache poi excel

斯卡拉 : Error: requirement failed: package stubbing