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

what is the idea and use of when(mock.method()).thenReturn(someValue) in mockito

在许多教程中找到了具有以下类似语句的示例 when(mock.method()).thenReturn(someValue);

谁能解释一下为什么要用这个??那是调用方法并期望在 thenReturn() 语句中给出这样的结果吗?如果我错了请纠正我。

对于模拟,您正在尝试模拟一个对象实现when 调用可以帮助您描述return模拟对象应具有的值。因为文档是不言自明的,所以对于其余的答案,我假设您正在寻找 Mockito 应该如何工作以及 when 如何帮助您设置模拟。

让我们创建一个界面来使用:

interface Foo {
  int bar();
}

大概有一些 Foo.bar 的实现者,但也许该实现很难在测试中使用:它可能使用文件存储、网络服务或某种随机值。 (或者,也许,您还没有编写真正的实现。)现在,您已经编写了一个名为 YourClass 的 class,它依赖于一个 Foo 实例,但是您不能出于上述任何原因,在您的测试中使用真实的。你是做什么的?

一种方法是在测试中编写一个非常小的实现:

Foo fakeFoo = new Foo() {
  @Override public int bar() { return 42; }
};
YourClass yourClass = new YourClass(fakeFoo);

现在您已经编写 fakeFoo 以获得可预测且易于理解的 return 值。这适用于这么小的东西,但不能扩展:如果 Foo 有十几种方法怎么办?如果您希望每次 return 一个不同的可预测值而不是每次 returning 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 您已经创建了要 return 的内容,就像fake 出于同样的原因,您在上面编写的 Foo 实现。从那里,您可以编写更多的 when 语句,或者依次为 return 提供 thenReturn 个更多的值,或者使用 verify 检查是否已进行调用。最重要的是,请记住:您没有使用 when 或模拟您正在测试的 class;你在嘲笑与合作的classes 你正在测试的class。