什么是when(mock.method())。thenReturn(someValue)in mockito的想法和用法

时间:2016-09-13 18:18:41

标签: java mockito mockmvc

在许多教程中发现了以下类似语句的示例 。的当(mock.method())thenReturn(someValue中);

任何人都可以触发为什么使用它?是调用方法并期望在thenReturn()语句中给出结果吗?如果我错了,请纠正我。

1 个答案:

答案 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或嘲笑您正在测试的课程;您正在嘲笑与您正在测试的课程合作的课程