Java when(mock.method()).thenReturn(someValue)在mockito中的作用是什么

Java when(mock.method()).thenReturn(someValue)在mockito中的作用是什么,java,mockito,mockmvc,Java,Mockito,Mockmvc,在许多教程中,我们发现了具有以下类似语句的示例 whenmock.method.Then返回某个值 有谁能说出为什么要用这个吗??是调用方法并期望返回语句中给出的结果吗??如果我错了,请纠正我。对于模拟,您试图模拟对象实现,when调用帮助您描述模拟对象应该具有的返回值。因为文档是非常自解释的,所以我将假设在剩下的答案中,您正在寻找Mockito应该如何工作以及何时帮助您设置mock 让我们制作一个界面来使用: interface Foo { int bar(); } 可能有一些Foo.b

在许多教程中,我们发现了具有以下类似语句的示例 whenmock.method.Then返回某个值


有谁能说出为什么要用这个吗??是调用方法并期望返回语句中给出的结果吗??如果我错了,请纠正我。

对于模拟,您试图模拟对象实现,when调用帮助您描述模拟对象应该具有的返回值。因为文档是非常自解释的,所以我将假设在剩下的答案中,您正在寻找Mockito应该如何工作以及何时帮助您设置mock

让我们制作一个界面来使用:

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您已经创建了要返回的内容,这与您出于相同原因在上面编写的伪Foo实现类似。从那里,您可以编写更多的when语句,或者给thenReturn更多的值以按顺序返回,或者使用verify检查是否进行了调用。最重要的是,请记住:您在测试类时没有使用或模拟该类;您正在模拟与您正在测试的类协作的类。

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