小编典典

如何告诉 Mockito 模拟对象在下次调用时返回不同的东西?

all

所以,我在类级别创建一个模拟对象作为静态变量,就像这样......在一个测试中,我想Foo.someMethod()返回一个特定的值,而在另一个测试中,我希望它返回一个不同的值。我遇到的问题是,我似乎需要重建模拟才能使其正常工作。我想避免重建模拟,并在每个测试中使用相同的对象。

class TestClass {

    private static Foo mockFoo;

    @BeforeClass
    public static void setUp() {
        mockFoo = mock(Foo.class);
    }

    @Test
    public void test1() {
        when(mockFoo.someMethod()).thenReturn(0);

        TestObject testObj = new TestObject(mockFoo);

        testObj.bar(); // calls mockFoo.someMethod(), receiving 0 as the value

    }

    @Test
    public void test2() {
        when(mockFoo.someMethod()).thenReturn(1);

        TestObject testObj = new TestObject(mockFoo);

        testObj.bar(); // calls mockFoo.someMethod(), STILL receiving 0 as the value, instead of expected 1.

    }

}

在第二个测试中,当 testObj.bar() 被调用时,我仍然收到 0
作为值......解决这个问题的最佳方法是什么?请注意,我知道我可以Foo在每个测试中使用不同的模拟,但是,我必须链接多个请求mockFoo,这意味着我必须在每个测试中进行链接。


阅读 89

收藏
2022-05-18

共1个答案

小编典典

首先不要使模拟静态。将其设为私有字段。只需将您的 setUp 类放在@Beforenot@BeforeClass中。它可能会运行一堆,但它很便宜。

其次,你现在拥有它的方式是让一个模拟返回不同的东西的正确方法,具体取决于测试。

2022-05-18