userList = new ArrayList<>(); User user1 = new User(); user1.setId(1L);user1.setName(\"Tom\"); userList.add(user1); User user2 = new User();
user2.setId(2L);
user2.setName(\"Jerry\"); userList.add(user2);
UserService userServiceMock = mock(UserService.class); when(userServiceMock.getUsers()).thenReturn(userList).thenReturn(Collections.emptyList()); ```
在这个例子中,我们创建了一个包含两个User对象的List对象userList,并使用Mockito来模拟UserService的getUsers方法的返回值。我们首先指定当调用一次getUsers方法时,返回userList对象;然后指定当调用第二次getUsers方法时,返回空的List对象。
需要注意的是,thenReturn方法的调用顺序与指定的顺序相同。在上面的例子中,当我们调用两次userServiceMock.getUsers()时,第一次将返回userList对象,第二次将返回空的List对象。
连续调用方法之thenThrow
当我们需要模拟方法抛出异常时,我们可以使用Mockito的thenThrow方法。与thenReturn方法类似,我们需要先创建一个Mock对象,并使用when方法来指定需要模拟的方法和参数。例如,我们有一个UserService类,其中有一个deleteUserById方
法,该方法接受一个userId参数并抛出一个
UserNotFoundException异常。我们可以使用Mockito来模拟这个方法抛出异常,代码如下:
```java
UserService userServiceMock = mock(UserService.class); doThrow(new
UserNotFoundException()).when(userServiceMock).deleteUserById(1L); ```
在这个例子中,我们创建了一个UserService的Mock对象userServiceMock,并使用deleteUserById
doThrow
1L
方法来指定当时,抛出一个
方法的参数为
UserNotFoundException异常。
需要注意的是,thenThrow方法只会对指定的方法和参数生效,如果我们没有指定所有可能的参数,那么未指定参数的方法调用将会正常执行。例如,如果我们没有指定deleteUserById方法的参数为
2L
时
的
异
常
,
那
么
当
我
们
调
用
userServiceMock.deleteUserById(2L)时,将会正常执行。
我们也可以使用thenThrow方法来模拟方法的多次调用。例如,我们有一个
deleteAllUsers
方法,该方法抛出一个
UserNotFoundException异常。我们可以使用Mockito来模拟该方法抛出异常,代码如下:
```java
UserService userServiceMock = mock(UserService.class); doThrow(new
UserNotFoundException()).doNothing().when(userServiceMock).deleteAllUsers(); ```
在这个例子中,我们创建了一个UserService的Mock对象userServiceMock,并使用doThrow方法来指定当调用一次deleteAllUsers方法时抛出一个UserNotFoundException异常;然后使用doNothing方法来指定当调用第二次deleteAllUsers方法时不抛出异常。
需要注意的是,thenThrow方法的调用顺序与指定的顺序相同。在上
面
的
例
子
中
,
当
我
们
调
用
两
次
userServiceMock.deleteAllUsers()时,第一次将抛出UserNotFoundException异常,第二次将不抛出异常。
总结
Mock的连续调用方法可以帮助我们模拟方法的多次调用和异常抛
出,从而更好地进行测试。在使用连续调用方法时,我们需要注意指定所有可能的参数和调用顺序,以避免出现意外的情况。同时,我们也可以使用Mockito的其他功能来更好地进行测试。