返回

Mockito 中的 doReturn() 和 when() 差异解析:何时使用哪个?

java

Mockito:理解 doReturn() 和 when() 的异同

作为一名经验丰富的程序员,我在测试 Java 应用程序时经常使用 Mockito。Mockito 提供了多种方法来设置模拟行为,其中 doReturn()when() 尤为重要。虽然这两个方法看似用途相似,但它们之间存在一些细微差别,了解这些差别对于有效使用 Mockito 至关重要。

用法

doReturn(): 用于为模拟对象的方法设置返回值,通常与 when() 方法结合使用。例如:

doReturn(10).when(mockObject).getValue();

when(): 除了设置返回值外,还可以指定方法被调用的条件。例如:

when(mockObject.getValue()).thenReturn(10);

关键区别

主要区别在于 when() 方法可以指定调用条件,而 doReturn() 则不能。这意味着:

  • doReturn(): 无条件地设置返回值。
  • when(): 可以基于方法调用时的特定条件来设置返回值。

何时使用 doReturn()

可以使用 doReturn() 的情况包括:

  • 当不需要设置调用条件时。
  • 当与其他 Mockito 方法(如 doCallRealMethod())结合使用时。

何时使用 when()

可以使用 when() 的情况包括:

  • 当需要指定调用条件时。
  • 当需要使用链式调用来设置多个返回值时。

示例

以下示例演示了 doReturn()when() 之间的区别:

// doReturn()
MockObject mockObject = mock(MockObject.class);
doReturn(10).when(mockObject).getValue();
int result = mockObject.getValue(); // result = 10

// when()
when(mockObject.getValue()).thenReturn(10);
result = mockObject.getValue(); // result = 10
when(mockObject.getValue()).thenReturn(20);
result = mockObject.getValue(); // result = 20

在第一个示例中,doReturn() 无条件地设置了 getValue() 方法的返回值为 10。而在第二个示例中,when() 允许我们设置不同的返回值,具体取决于方法调用的条件。

总结

doReturn()when() 方法都是 Mockito 中用于设置模拟行为的强大工具。了解它们之间的细微差别对于有效使用 Mockito 至关重要。一般来说,doReturn() 适合于不需要条件的简单返回值设置,而 when() 则更适合于需要基于调用条件设置复杂返回值的情况。

常见问题解答

1. doReturn() 和 when() 有什么共同点?

两者都用于设置模拟对象的方法返回值。

2. 为什么 when() 比 doReturn() 更灵活?

because when() 可以指定调用条件,而 doReturn() 则不能。

3. 在哪些情况下应使用 doReturn()?

当不需要设置调用条件时。

4. 在哪些情况下应使用 when()?

当需要指定调用条件或使用链式调用设置多个返回值时。

5. 如何使用链式调用来设置多个返回值?

when(mockObject.getValue()).thenReturn(10).thenReturn(20);