不用每日缠绵,时刻联系,你知道他不会走,他知道你不会变,这就是最美好的爱情
Mockito | 单元测试-模拟外部依赖
Mockito 是一个基于 Java 的单元测试框架,可以模拟对象、行为和结果。Mockito 的主要目的是通过模拟外部依赖来提高单元测试的可靠性和速度。
Mockito 的主要特点包括:
-
易于使用:Mockito 提供简单的 API,使得测试人员可以轻松创建模拟对象,并进行模拟操作。
-
功能强大:Mockito 可以模拟各种对象,包括接口、抽象类和普通类等。
-
灵活性高:Mockito 允许您对对象进行各种行为和结果的模拟,可以轻松地进行单元测试。
-
易于集成:Mockito 可以很容易地与其他测试框架(如JUnit和TestNG)集成。
Mockito 的主要应用场景包括:
-
单元测试:Mockito 可以帮助测试人员快速创建模拟对象,并进行模拟操作,从而提高单元测试的可靠性和速度。
-
行为驱动开发(BDD):Mockito 可以帮助测试人员编写具有自然语言语法的测试用例,从而使测试用例更易于理解和维护。
-
集成测试:Mockito 可以模拟外部依赖,从而使得测试人员可以对整个系统进行测试,而不仅仅是某个模块。
总之,Mockito 是一个非常实用的单元测试框架,可以帮助测试人员轻松创建模拟对象,并进行模拟操作,从而提高单元测试的可靠性和速度。
模拟接口
假设我们有一个 UserService 接口,其中有一个查询用户信息的方法 getUserById(Long id),现在我们需要对这个方法进行单元测试,可以使用 Mockito 来模拟 UserService 接口。
首先需要添加 Mockito 的依赖,可以在 Maven 的 pom.xml 文件中添加如下依赖:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>3.8.0</version>
<scope>test</scope>
</dependency>
然后编写测试代码,使用 @Mock 注解来创建 UserService 接口的模拟对象,并使用 Mockito.when() 方法来模拟 getUserById() 方法的返回结果:
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceTest {
@Mock
private UserService userService;
@Test
public void testGetUserById() {
Long id = 1L;
User mockUser = new User();
mockUser.setId(id);
mockUser.setName("Mock User");
Mockito.when(userService.getUserById(id)).thenReturn(mockUser);
User result = userService.getUserById(id);
Assert.assertEquals(mockUser, result);
}
}
在上面的测试代码中,使用 @Mock 注解来创建 UserService 接口的模拟对象,并使用 Mockito.when() 方法来模拟 getUserById() 方法的返回结果。最后,调用 UserService 接口的 getUserById() 方法,并使用断言方法来验证返回结果是否正确。
需要注意的是,在使用 Mockito 进行单元测试时,应该将测试类上的注解 @RunWith(MockitoJUnitRunner.class) 修改为 @RunWith(SpringRunner.class),这样可以保证测试类能够自动注入 Spring Bean。
总之,Mockito 可以帮助我们快速创建模拟对象,并进行模拟操作,从而提高单元测试的可靠性和速度。在使用 Mockito 进行单元测试时,应该注意注解的使用,确保测试类能够自动注入 Spring Bean。
对象进行各种行为和结果的模拟
假设我们有一个 UserService 接口,其中有一个新增用户的方法 addUser(User user),现在我们需要对这个方法进行单元测试,并使用 Mockito 对方法的行为和结果进行模拟。
首先需要添加 Mockito 的依赖,可以在 Maven 的 pom.xml 文件中添加如下依赖:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>3.8.0</version>
<scope>test</scope>
</dependency>
然后编写测试代码,使用 @Mock 注解来创建 UserService 接口的模拟对象,并使用 Mockito.when() 方法来模拟 addUser() 方法的行为和结果:
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceTest {
@Mock
private UserService userService;
@Test
public void testAddUser() {
User user = new User();
user.setName("Test User");
user.setAge(18);
Mockito.doNothing().when(userService).addUser(Mockito.any(User.class));
userService.addUser(user);
Mockito.verify(userService, Mockito.times(1)).addUser(Mockito.any(User.class));
}
}
在上面的测试代码中,使用 @Mock 注解来创建 UserService 接口的模拟对象,并使用 Mockito.doNothing() 方法来模拟 addUser() 方法的行为,表示方法不会有任何返回值。然后,调用 UserService 接口的 addUser() 方法,并使用 Mockito.verify() 方法来验证方法是否被调用过。
另外,Mockito 还支持对方法的参数和返回值进行模拟。例如,我们可以使用 Mockito.when() 方法来模拟 getUserById() 方法的返回结果:
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceTest {
@Mock
private UserService userService;
@Test
public void testAddUser() {
User user = new User();
user.setName("Test User");
user.setAge(18);
Mockito.doNothing().when(userService).addUser(Mockito.any(User.class));
userService.addUser(user);
Mockito.verify(userService, Mockito.times(1)).addUser(Mockito.any(User.class));
}
}
在上面的测试代码中,使用 @Mock 注解来创建 UserService 接口的模拟对象,并使用 Mockito.doNothing() 方法来模拟 addUser() 方法的行为,表示方法不会有任何返回值。然后,调用 UserService 接口的 addUser() 方法,并使用 Mockito.verify() 方法来验证方法是否被调用过。
另外,Mockito 还支持对方法的参数和返回值进行模拟。例如,我们可以使用 Mockito.when() 方法来模拟 getUserById() 方法的返回结果:
User mockUser = new User();
mockUser.setId(id);
mockUser.setName("Mock User");
Mockito.when(userService.getUserById(id)).thenReturn(mockUser);
在上面的代码中,使用 Mockito.when() 方法来模拟 getUserById() 方法的返回结果,表示方法将会返回一个指定的 User 对象。
总之,Mockito 可以帮助我们模拟对象的各种行为和结果,从而提高单元测试的覆盖率和可靠性。在使用 Mockito 进行单元测试时,应该注意注解的使用,确保测试类能够自动注入 Spring Bean。
测试 web接口
以使用Spring Boot Test框架提供的MockMvc来测试web接口,MockMvc可以模拟HTTP请求并验证HTTP响应。下面是一个示例:
假设我们有一个UserController,其中包含一个返回用户信息的接口getUserById:
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public UserDto getUserById(@PathVariable("id") Long id) {
return userService.getUserById(id);
}
}
我们可以使用MockMvc来模拟HTTP请求并验证HTTP响应。下面是一个对getUserById接口进行测试的示例:
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testGetUserById() throws Exception {
// 构造HTTP请求
MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.get("/users/{id}", 1L))
.andExpect(MockMvcResultMatchers.status().isOk())
.andReturn();
// 验证HTTP响应
String content = mvcResult.getResponse().getContentAsString();
ObjectMapper objectMapper = new ObjectMapper();
UserDto userDto = objectMapper.readValue(content, UserDto.class);
Assert.assertEquals(1L, userDto.getId().longValue());
Assert.assertEquals("Test User", userDto.getName());
}
}
在上面的代码中,我们使用了Spring Boot Test框架提供的@SpringBootTest注解来启动Spring Boot应用程序,并使用@AutoConfigureMockMvc注解自动配置MockMvc。在测试方法中,我们使用MockMvcRequestBuilders.get方法构造HTTP请求,使用MockMvcResultMatchers.status方法验证HTTP响应状态码是否为200,并通过objectMapper将HTTP响应转换为Java对象。最后,我们使用Assert.assertEquals方法来验证Java对象是否符合预期。
这样就可以使用MockMvc来测试web接口了。
MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.get("/users/{id}", 1L))
.andExpect(MockMvcResultMatchers.status().isOk())
.andReturn();
这段代码使用了MockMvc进行了一个GET请求的模拟测试。
首先,通过MockMvcRequestBuilders.get()方法构建了一个GET请求,请求的URI为"/users/{id}",其中{id}是一个路径参数,这里设置为1L。这个请求的构建方法还可以通过添加请求头、请求参数、请求体等来定制化请求。
然后,通过andExpect()方法对请求的返回结果进行验证。这里使用了MockMvcResultMatchers.status()方法,验证请求的HTTP状态码是否为200(即isOk()方法)。如果验证失败,则抛出异常。
最后,使用andReturn()方法获取到请求的返回结果MvcResult对象,该对象包含了请求的响应内容、响应状态码、响应头等信息,可以通过它来进行更详细的验证或处理。