【发布时间】:2016-06-16 00:07:34
【问题描述】:
我有一个在设备上运行的程序 Foo,它首先调用方法 1(),然后调用外部模块 Bar 上的方法 2()。 当 both 被调用时,作为响应,Bar 在 Foo 上调用 request()。 为了模拟 Bar,它有一个对 Foo 的引用和一个调用 foo.request() 的方法 call_Request()
// in class BarTest
@Test
public void barFlow() {
InOrder inOrder = inOrder(mockBar);
inOrder.verify(mockBar).method1(anyInt());
inOrder.verify(mockBar).method2();
// what to put as 'thenCallMethod'?
when(mockBar.method2()).thenCallMethod().call_Request();
}
...
// in class Bar
public void call_Request() {
foo.request();
}
我不能简单地在方法 2 中调用 call_Request(),因为只有当两个方法都按顺序调用时才会发生响应。其他时候,可能会发生不同的反应。
'thenCallMethod' 会做什么 Mockito 技巧?
(我使用的是与 Android Studio 2.1 捆绑的 Mockito 1.10.19 版)
【问题讨论】:
-
您是否有理由为此需要使用 Mockito? Mockito 可以存根和验证
interactions,但是一旦你模拟了一个有状态的协作者,你就必须开始编写聪明而复杂的 InOrder 验证和 Answer 实例(等等)。与mockBar相比,编写FakeBar实现类并在测试中检查其状态可能要容易得多。 -
@JeffBowman 实现 Fake 对象需要从 xml 文件中读取的类似规则。我认为使用 Mockito 会更容易。实现所有“胶水”。如果这是最复杂的,它可以得到; method1 后跟 method2,我怎样才能使用 Mock 对象呢?
-
恕我直言,模拟对象应该能够调用方法。
-
你知道Answer对象吗?
-
@JeffBowman 但我如何将 Answer 与 InOrder 结合起来?
标签: unit-testing mockito