Mockito 中的 doReturn() 和 when() 差异解析:何时使用哪个?
2024-03-08 17:58:16
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);