springboot怎么写单元测试
Java Spring Boot提供了一个非常方便的测试框架,可以轻松地编写单元测试。下面是一个详细的例子:
假设我们有一个简单的控制器类,用于处理HTTP请求,并返回JSON格式的响应:
@RestController public class UserController { @Autowired private UserService userService; @GetMapping("/users/{id}") public User getUserById(@PathVariable Long id) { return userService.getUserById(id); } }
我们的UserService类也非常简单,只是从一个内存列表中获取用户对象:
@Service public class UserService { private List<User> userList = Arrays.asList( new User(1L, "Alice"), new User(2L, "Bob"), new User(3L, "Charlie") ); public User getUserById(Long id) { return userList.stream() .filter(user -> user.getId().equals(id)) .findFirst() .orElse(null); } }
现在我们想编写一个单元测试来测试这个控制器的行为。我们可以使用Spring Boot提供的MockMvc类来模拟HTTP请求和响应,并使用Mockito来模拟UserService。
@RunWith(SpringRunner.class) @WebMvcTest(UserController.class) public class UserControllerTest { @Autowired private MockMvc mockMvc; @MockBean private UserService userService; @Test public void testGetUserById() throws Exception { // 模拟UserService返回一个用户对象 User user = new User(1L, "Alice"); Mockito.when(userService.getUserById(1L)).thenReturn(user); // 发送HTTP GET请求 MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/users/1")) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON_UTF8)) .andReturn(); // 解析响应JSON字符串 ObjectMapper objectMapper = new ObjectMapper(); User responseUser = objectMapper.readValue(result.getResponse().getContentAsString(), User.class); // 验证返回的用户对象是否正确 Assert.assertEquals(user.getId(), responseUser.getId()); Assert.assertEquals(user.getName(), responseUser.getName()); } }
在这个测试中,我们使用了@RunWith注解来指定测试运行器,@WebMvcTest注解来指定要测试的控制器类,@Autowired注解来注入MockMvc实例,@MockBean注解来注入UserService的模拟对象。
在testGetUserById方法中,我们使用Mockito.when方法来模拟UserService的行为,然后使用MockMvc.perform方法来发送HTTP GET请求,并使用MockMvcResultMatchers来验证响应的状态码和内容类型。最后,我们使用ObjectMapper来解析响应JSON字符串,并验证返回的用户对象是否正确。
总之,Java Spring Boot提供了非常方便的测试框架,可以帮助我们编写高质量的单元测试。