用其他方法模拟方法

时间:2017-12-06 16:21:04

标签: java unit-testing mocking mockito

我想测试以下方法:

public boolean sendMessage(Agent destinationAgent, String message, Supervisor s, MessagingSystem msgsys, String time) throws ParseException {
    if(mailbox.getMessages().size() > 25){
        return false;
    }else{
        if(login(s, msgsys, time)){
            try {
                sentMessage = msgsys.sendMessage(sessionkey, this, destinationAgent, message);
                if(sentMessage.equals("OK")) {
                    return true;
                }
                return false;
            } catch (ParseException e) {
                e.printStackTrace();
                return false;
            }
        }
        return false;
    }
}

我想模仿方法login(s, msgsys, time)。我这样做如下:

@Mock
private Supervisor supervisor;
@Mock
private MessagingSystem msgsys;

@Test
public void testSendMessageSuccess() throws ParseException {
    String message = "Hey";
    Agent destination = new Agent("Alex", "2");
    agent.sessionkey = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";

    when(agent.login(supervisor, msgsys, anyString())).thenReturn(true);
    when(msgsys.sendMessage(agent.sessionkey, destination, agent, message)).thenReturn("OK");

    boolean result = agent.sendMessage(destination, message, supervisor, msgsys, time);

    assertEquals(true, result);
}

但是,遇到以下错误:

org.mockito.exceptions.misusing.WrongTypeOfReturnValue: 
Boolean cannot be returned by getLoginKey()
getLoginKey() should return String

请注意方法getLoginKey() - 返回一个String,在方法login(s, msgsys, time)内调用,它属于一个接口类。

@Before
public void setup(){
    MockitoAnnotations.initMocks(this);
    agent = new Agent("David", "1");
    time = dateFormat.format(new Date());
}

@After
public void teardown(){
    agent = null;
}

1 个答案:

答案 0 :(得分:2)

如果你想模拟Agent中的一个方法(在你的情况下为login()),那么你试图存根的Agent需要是模拟或间谍。

因为在你的情况下,login()是你想要使用Agent类的其余功能进行模拟的唯一方法,那么你应该隐藏这个对象:

@Before
public void setup(){
    MockitoAnnotations.initMocks(this);
    agent = Mockito.spy(new Agent("David", "1"));
    time = dateFormat.format(new Date());
}

请注意,在将间谍绑定到您时需要使用以下语法:

doReturn(true).when(agent).login(supervisor, msgsys, anyString());