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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (20)

因此,我在类级别上创建一个模拟对象作为静态变量,如下所示。在一次测试中,我想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这意味着我必须在每个测试中做链接。

提问于
用户回答回答于

首先,不要使模拟静态。把它变成私人领域。只需将安装类放在@Before@BeforeClass

其次,您现在拥有它的方式是获得一个模拟的正确方法,以根据测试返回不同的内容。

用户回答回答于

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import org.junit.Before;
import org.junit.Test;

public class TestClass {

    private Foo mockFoo;

    @Before
    public void setup() {
        setupFoo();
    }

    @Test
    public void testFoo() {
        TestObject testObj = new TestObject(mockFoo);

        assertEquals(0, testObj.bar());
        assertEquals(1, testObj.bar());
        assertEquals(-1, testObj.bar());
        assertEquals(-1, testObj.bar());
    }

    private void setupFoo() {
        mockFoo = mock(Foo.class);

        when(mockFoo.someMethod())
            .thenReturn(0)
            .thenReturn(1)
            .thenReturn(-1); //any subsequent call will return -1

        // Or a bit shorter with varargs:
        when(mockFoo.someMethod())
            .thenReturn(0, 1, -1); //any subsequent call will return -1
    }
}

扫码关注云+社区