Master the senior application method and skills of mastering the Mockito framework
Mockito is a Java framework for unit testing. It helps us simulate objects and behaviors so that it is easier to test.This article will introduce the advanced application methods and techniques of the Mockito framework, and provide some Java code examples.
1. Use Annotations for simulation:
Mockito can use annotations to simulate objects, which can simplify code and improve readability.By using the `@mock` annotation, we can quickly create an analog object.For example:
@Mock
private UserService userService;
Then, we can inject the simulation object into the class that needs to be used by using the `@injectmocks` annotation.For example:
@InjectMocks
private UserController userController;
In this way, when testing the UserController class, Mockito will automatically inject the simulated userService object into the UserController.
2. The return value of the simulation method:
Sometimes we need the return value of the simulation method for testing.Mockito can be achieved by using the `Thenreturn 'method.For example, in the example below, when the `getuserByid` method of using userService is called, the designated user object will be returned:
when(userService.getUserById(1)).thenReturn(new User(1, "John Doe"));
In this way, where you need to use the `GetuserbyID` method, you will return the designated user object.
3. Throw the abnormal abnormality of the simulation method:
Mockito can also simulate the method of throwing abnormalities for abnormal processing tests.We can use the `Thenthrow` method to implement this.For example, in the example below, when the `getuserByid` method of using userService is called, a specified abnormality will be thrown:
when(userService.getUserById(1)).thenThrow(new UserNotFoundException());
In this way, when calling the `getUserbyID` method, UsernotFoundException will be thrown out.
4. Verification method calls:
Mockito can also be used to verify the number of calls and sequences of the method to ensure the correctness of the code.We can use the `Verify` method to implement this.For example, in the following example, we verified that the `getuserByid` method of UserService was called once:
verify(userService, times(1)).getUserById(1);
If the number of methods of the method does not meet the expectations, Mockito will throw an VerificationException anomalies.
5. Simulate according to the conditions:
Sometimes, we need to simulate the behavior of the method according to certain conditions.Mockito can use the `ArgumentMatches` class to implement this.For example, in the following example, we simulate different returns based on the values of the parameters:
when(userService.getUserById(anyInt())).thenReturn(new User(1, "John Doe"));
In this way, no matter what parameters are introduced when calling the `GetuserByid` method, it will return the designated user object.
Summarize:
This article introduces some advanced applications and techniques of the Mockito framework, including the use of annotations for simulation, simulation method return value and throwing abnormalities, the number of calls and sequences of verification methods, and simulation according to conditions.These methods and techniques can help us more conveniently perform unit testing and improve code coverage and reliability.
Reference Code:
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class UserControllerTest {
@Mock
private UserService userService;
@InjectMocks
private UserController userController;
@Test
public void testGetUserById() {
// Simulation return value
when(userService.getUserById(1)).thenReturn(new User(1, "John Doe"));
// Call method
User user = userController.getUserById(1);
// Whether the verification method is called
verify(userService, times(1)).getUserById(1);
// Verification return value
assertEquals(1, user.getId());
assertEquals("John Doe", user.getName());
}
@Test(expected = UserNotFoundException.class)
public void testGetUserByIdWithException() {
// Simulation throw an exception
when(userService.getUserById(1)).thenThrow(new UserNotFoundException());
// Call method
User user = userController.getUserById(1);
}
@Test
public void testGetUserByIdWithAnyParameter() {
// The simulation returns different return values according to the values of the parameter
when(userService.getUserById(anyInt())).thenReturn(new User(1, "John Doe"));
// Call method
User user = userController.getUserById(2);
// Whether the verification method is called
verify(userService, times(1)).getUserById(2);
// Verification return value
assertEquals(1, user.getId());
assertEquals("John Doe", user.getName());
}
}