因此,我在类级别上创建了一个模拟对象作为静态变量,如下所示...在一个测试中,我希望Foo.someMethod()
返回某个值,而在另一个测试中,我希望它返回一个不同的值。我遇到的问题是,我似乎需要重新构建mock,才能让它正常工作。我希望避免重新构建mock,只在每次测试中使用相同的对象。
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
的多个请求,这意味着我必须在每个测试中进行链接。
发布于 2010-11-18 23:45:53
首先,不要让mock成为静态的。将其设置为私有字段。只需将setUp类放在@Before
中,而不是@BeforeClass
中。它可能运行了一大堆,但它很便宜。
其次,你现在使用的方法是让mock根据测试返回不同的东西的正确方法。
发布于 2018-05-24 20:09:05
对于所有搜索返回某些内容,然后查找另一个调用抛出异常的人:
when(mockFoo.someMethod())
.thenReturn(obj1)
.thenReturn(obj2)
.thenThrow(new RuntimeException("Fail"));
或
when(mockFoo.someMethod())
.thenReturn(obj1, obj2)
.thenThrow(new RuntimeException("Fail"));
发布于 2018-10-24 19:23:46
或者,更干净的:
when(mockFoo.someMethod()).thenReturn(obj1, obj2);
https://stackoverflow.com/questions/4216569
复制相似问题