Mockito.when是一种Mockito框架中的方法,它可以用于模拟返回值和异常。该方法接受一个方法调用作为参数,然后可以使用链式调用来模拟方法的返回值或抛出一个异常。
一、Mockito.when的基本语法
Mockito.when的语法格式如下:
when(mock.method()).thenReturn(value);
// or
when(mock.method()).thenThrow(exception);
在这里,mock是被模拟的对象,method是被模拟的方法,value是模拟的返回值,exception是模拟的异常。
使用Mockito.when时,必须先创建一个mock对象,并指定它模拟哪个类或接口。例如:
SomeInterface mock = Mockito.mock(SomeInterface.class);
这将创建一个模拟SomeInterface接口的mock对象。然后,就可以使用Mockito.when来模拟该接口的方法了。
二、Mockito.when的链式调用
使用Mockito.when的另一个强大功能是链式调用。链式调用允许我们按方法的顺序指定模拟的返回值或异常。
下面是一个简单的例子,它演示了如何使用Mockito.when和链式调用来模拟一个方法的返回值:
when(mock.getValue()).thenReturn("hello").thenReturn("world");
String first = mock.getValue(); // returns "hello"
String second = mock.getValue(); // returns "world"
在这个例子中,我们使用了两个thenReturn方法来指定两个不同的返回值。我们首先指定返回值为"hello",然后指定返回值为"world"。
当我们使用mock.getValue()方法时,Mockito会注意到我们使用了两个thenReturn方法,并依次返回它们。第一次调用时,返回值为"hello",第二次调用时,返回值为"world"。
三、Mockito.when的参数匹配器
Mockito.when还提供了参数匹配器的功能。参数匹配器允许您指定对于某些参数,Mockito应该如何模拟方法的行为。
下面是一个例子,它演示了如何使用参数匹配器:
when(mock.someMethod(anyInt(), eq("test"))).thenReturn("result");
String result = mock.someMethod(1, "test"); // returns "result"
在这个例子中,我们指定了一个参数匹配器anyInt()和一个参数匹配器eq("test")。anyInt()匹配任何整数值,eq("test")匹配"test"字符串。
当我们调用mock.someMethod(1, "test")方法时,Mockito会首先检查第一个参数是否为任何整数值(由anyInt() 匹配),然后检查第二个参数是否等于"test"字符串(由eq("test")匹配),如果两个参数都匹配,则返回"result"字符串。
四、Mockito.when的异常模拟
Mockito.when还可以用于模拟方法抛出异常的情况。你可以使用Mockito.when和thenThrow方法来模拟异常:
when(mock.someMethod()).thenThrow(new Exception());
mock.someMethod(); // throws Exception
在这个例子中,我们使用Mockito.when和thenThrow方法来模拟模拟方法抛出异常。在我们调用mock.someMethod()方法的时候,它将抛出一个Exception异常。
五、总结
在本文中,我们学习了Mockito.when的基本语法、链式调用、参数匹配器和异常模拟。Mockito.when是Mockito框架中最常用的方法之一,它允许我们使用简单、有效的语法模拟方法的行为。
下面是学习Mockito.when的完整示例代码:
public class MockExample {
public static void main(String[] args) {
// 创建Mock对象
SomeInterface mock = Mockito.mock(SomeInterface.class);
// 模拟返回值
when(mock.getValue()).thenReturn("hello").thenReturn("world");
String first = mock.getValue(); // returns "hello"
String second = mock.getValue(); // returns "world"
// 参数匹配器
when(mock.someMethod(anyInt(), eq("test"))).thenReturn("result");
String result = mock.someMethod(1, "test"); // returns "result"
// 异常模拟
when(mock.someMethod()).thenThrow(new Exception());
try {
mock.someMethod(); // throws Exception
} catch (Exception e) {
// Handle Exception
}
}
}
public interface SomeInterface {
String getValue();
String someMethod(int num, String str) throws Exception;
}