使用Mockito进行单元测试会将模拟类的实例变量重置为null

时间:2014-10-27 09:46:30

标签: java unit-testing mocking testng mockito

我已按如下方式(在TestNG单元测试类中)模拟了一个Message类:

@BeforeMethod
protected void setUp() {
    message = mock(Message.class);
}

我可以向您保证,我已在Unit测试类中声明message类型Message。现在,Message类有一个名为category的实例变量,其类型为String,如下所示:

public class Message {
    private String category;

    public String getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category = category;
    }
}

好的,现在问题是:在一个小的测试方法中,我必须设置模拟的category实例的message,然后将category用于单元测试中的另一个任务。但是,在为category消息设置mocked后,它又会再次恢复为null。这是代码:

public void shouldSendMessagesWithCategory() {
    message.setCategory("F1 Racing"); // SET THE CATEGORY

    raceResults.addSubscriber("F1 Racing", clientA); 
    System.out.println("Cat" + message.getCategory()); // THE MESSAGE's CATEGORY IS NULL

    raceResults.send(message);

    verify(clientA).receive(message);
}

控制台打印出null - 所以我肯定知道它是null。我一直试图弄清楚这两天,但似乎我错过了一些东西。所以任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

您可以使用spy()代替Mock()。然后你可以保持设定值。你有另一种选择。您可以使用doReturn("F1 Racing").when(message).getCategory();返回要返回的值。

答案 1 :(得分:1)

“message”句柄不指向真正的Message对象 - 它指向一个没有真实功能的模拟对象。如果你想让mock'ed对象从getCategory()返回一个值,你也必须模拟它。类似的东西:

when(message.getCategory()).thenReturn("My Category");