【发布时间】:2016-09-13 18:18:40
【问题描述】:
在许多教程中找到了具有以下类似语句的示例 when(mock.method()).thenReturn(someValue);
任何人都可以请触发为什么使用它?那是调用该方法并期望在 thenReturn() 语句中给出的结果吗?如果我错了,请纠正我。
【问题讨论】:
-
是的,基本上。这些名称是不言自明的——与其他类似框架相比,这是 mockito 的优势之一。
在许多教程中找到了具有以下类似语句的示例 when(mock.method()).thenReturn(someValue);
任何人都可以请触发为什么使用它?那是调用该方法并期望在 thenReturn() 语句中给出的结果吗?如果我错了,请纠正我。
【问题讨论】:
对于模拟,您尝试模拟对象实现,when 调用可帮助您描述模拟对象应具有的返回值。因为文档非常不言自明,所以我假设您正在寻找 Mockito 应该如何工作以及 when 如何帮助您设置模拟的其余答案。
让我们创建一个可以使用的接口:
interface Foo {
int bar();
}
大概有一些Foo.bar 的实现者,但也许这种实现很难在测试中使用:它可能使用文件存储、网络服务或某种随机值。 (或者,也许,您还没有编写真正的实现。)现在,您已经编写了一个名为 YourClass 的类,它依赖于 Foo 实例,但您不能在测试中使用真实的以上任何原因。你是做什么的?
一种方法是在您的测试中编写一个非常小的实现:
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 语句,您告诉 mock Foo 您已经创建了要返回的内容,这就像您的 fake Foo 实现一样出于同样的原因写在上面。从那里,您可以编写更多when 语句,或者给您的thenReturn 更多值以按顺序返回,或者使用verify 检查是否已进行调用。最重要的是,请记住:您没有使用when 或模拟您正在测试的课程;您正在模拟与您正在测试的班级合作的班级。
【讨论】: