【问题标题】:what is the idea and use of when(mock.method()).thenReturn(someValue) in mockitomockito 中 when(mock.method()).thenReturn(someValue) 的想法和用途是什么
【发布时间】:2016-09-13 18:18:40
【问题描述】:

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

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

【问题讨论】:

  • 是的,基本上。这些名称是不言自明的——与其他类似框架相比,这是 mockito 的优势之一。

标签: java mockito mockmvc


【解决方案1】:

对于模拟,您尝试模拟对象实现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 或模拟您正在测试的课程;您正在模拟与您正在测试的班级合作的班级

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 2017-07-21
    • 2016-01-12
    • 1970-01-01
    相关资源
    最近更新 更多