在许多教程中发现了以下类似语句的示例 。的当(mock.method())thenReturn(someValue中);
任何人都可以触发为什么使用它?是调用方法并期望在thenReturn()语句中给出结果吗?如果我错了,请纠正我。
答案 0 :(得分:1)
对于模拟,您尝试模拟对象实现,when
调用可帮助您描述模拟对象应具有的返回值。因为文档非常明确,所以我会在其余的答案中假设您正在寻找Mockito应该如何工作以及when
如何帮助您设置模拟。< / p>
让我们建立一个界面:
interface Foo {
int bar();
}
据推测,那里有一些Foo.bar
的实现者,但也许这种实现很难在测试中使用:它可能使用文件存储,网络服务或某种随机值。 (或者,也许,你还没有编写真正的实现。)现在,你已经编写了一个名为YourClass
的类,它取决于Foo
实例,但你可以&#39 ;出于上述任何原因,在测试中使用真实的。你做什么的?
一种方法是在测试中编写一个非常小的实现:
Foo fakeFoo = new Foo() {
@Override public int bar() { return 42; }
};
YourClass yourClass = new YourClass(fakeFoo);
现在,您已编写fakeFoo
以获得可预测且易于理解的返回值。这适用于这么小的东西,但它不能扩展:如果Foo有十几种方法怎么办?如果不是每次返回42,你想每次都返回一个不同的可预测值,该怎么办?如果您想稍后查看bar
是否被调用,该怎么办? Mockito通过切换语法帮助您完成所有这些:
Foo mockFoo = Mockito.mock(Foo.class);
when(mockFoo.bar()).thenReturn(42); // <- the statement you're asking about
YourClass yourClass = new YourClass(mockFoo);
现在,使用when
语句,您告诉模拟 Foo您已经创建了返回的内容,就像假< / em>你在上面写的Foo实现是出于同样的原因。从那里,您可以编写更多when
语句,或者按顺序返回thenReturn
个更多值,或使用verify
检查是否已拨打电话。最重要的是,请记住:您没有使用when
或嘲笑您正在测试的课程;您正在嘲笑与您正在测试的课程合作的课程。