下面我们就详细讲解一下Spring单元测试控制Bean注入的方式的完整攻略吧。
Spring单元测试是指在Spring环境下执行单元测试。它可以模拟一个Web容器环境,通过IoC和AOP的支持,创建出被测试类的实例,来执行相应的测试操作。
在Spring单元测试中,我们有三种方式可以控制Bean的注入:
在单元测试类中使用@Autowired注解,来对被测试类中需要被注入的属性进行注入。例如:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {AppConfig.class})
public class UserServiceTest {
@Autowired
private UserService userService;
@Test
public void testFindById() {
User user = userService.findById(1L);
Assert.assertNotNull(user);
}
}
在上述示例中,代码注入了一个UserService类型的Bean,并在测试方法中使用了它。
@MockBean注解用于创建Mock对象,并将其注入到 Spring IoC 容器中。我们可以利用该注解将被测试类中需要的Bean进行Mock。
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceTests {
@Autowired
private UserService userService;
//使用MockBean
@MockBean
private UserRepository userRepository;
@Test
public void testFindById() {
User user = new User();
user.setId(1L);
Mockito.when(userRepository.findById(1L)).thenReturn(Optional.of(user));
User userResult = userService.findById(1L);
assertNotNull(userResult);
assertEquals(userResult.getId(), user.getId());
}
}
在上述示例中,代码注入了一个UserService类型的Bean,并使用了一个Mock的UserRepository来替代真实的UserRepository,用于模拟测试时的数据情况。
@SpyBean注解用于创建 Spy 对象(也就是伪造对象),并将其注入到 Spring IoC 容器中。与使用@MockBean注解的方式不同的是,@SpyBean注解创建的对象是一个真实的对象,只是其行为被更改以适应单元测试的需要。
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceTests {
@Autowired
private UserService userService;
//使用SpyBean
@SpyBean
private UserRepository userRepository;
@Test
public void testFindById() {
User user = new User();
user.setId(1L);
Mockito.when(userRepository.findById(1L)).thenReturn(Optional.of(user));
User userResult = userService.findById(1L);
assertNotNull(userResult);
assertEquals(userResult.getId(), user.getId());
}
}
在上述示例中,代码注入了一个UserService类型的Bean,并使用了一个Spy的UserRepository来替代真实的UserRepository,用于在测试中动态监控UserRepository的行为。
我们利用上述三种方式进行一个示范,在此示范中,我们创建了一个Controller测试类,并使用到了上述三种方式。代码如下:
@RunWith(SpringRunner.class)
@WebMvcTest(UserController.class)
public class UserControllerTests {
@Autowired
private MockMvc mockMvc;
// 使用@Autowired注入UserService
@Autowired
private UserService userService;
// 使用@MockBean注入UserRepository
@MockBean
private UserRepository userRepository;
// 使用@SpyBean注入DepartmentService
@SpyBean
private DepartmentService departmentService;
@Test
public void testGetUser() throws Exception {
// 给userRepository设置测试用户
User testUser = new User();
testUser.setId(1L);
testUser.setUsername("testUser");
Mockito.when(userRepository.findById(1L)).thenReturn(Optional.of(testUser));
// 给departmentService设置测试部门
Department testDepartment = new Department();
testDepartment.setId(1L);
testDepartment.setName("testDepartment");
Mockito.doReturn(testDepartment).when(departmentService).findById(1L);
MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.get("/users/1"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andReturn();
String response = mvcResult.getResponse().getContentAsString();
String expectedResponse = "{\"id\":1,\"username\":\"testUser\",\"department\":{\"id\":1,\"name\":\"testDepartment\"}}";
assertEquals(expectedResponse, response);
}
}
在上述示例中,我们使用@WebMvcTest注解对UserController进行了单元测试,其中使用了@Autowired注入了UserService,使用了@MockBean注入了UserRepository,使用了@SpyBean注入了DepartmentService,在测试中,我们通过Mockito进行模拟数据,然后访问Controller并断言返回值与我们期望的返回值相等。
以上就是Spring单元测试控制Bean注入的方式的完整攻略,希望可以帮助到你。
本文链接:http://task.lmcjl.com/news/13264.html