为什么要单元测试?
如果不单元测试,不知道具体功能代码模块是否正确,只能通过PostMan或者启动项目Http请求去测试功能,而且不能具体测试某个代码块的功能(比如单独测试 FindUserByID 这个功能模块),有单元测试之后程序员可以自己测试自己写的代码功能是否正确。
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-testartifactId>
- <scope>testscope>
- dependency>
生成Service测试环境
- @SpringBootTest
- class FindUserByIdServiceImpTest {
- @Autowired
- private FindUserByIdService findUserByIdService;
- @Test
- void findUserById() {
- UserVO user = findUserByIdService.findUserById(130);
- System.out.println(user.getUsername()+user.getPhonenumber());
- System.out.println(user);
- }
- }
测试代码
@SpringBootTest:测试类所需注解
@Test:测试方法所需注解
- @RunWith的作用
- @RunWith:就是一个运行器
- @RunWith(SpringRunner.class):指让类运行在Spring的测试环境,以便测试开始时自动创建Spring应用上下文
- @RunWith(JUnit4.class) 指用JUnit4测试工具来运行测试。
- @RunWith(SpringJUnit4ClassRunner.class):综合了注释2和注释3,让测试类运行于Spring测试环境,并使用JUnit4测试工具来运行测试。
- @RunWith(Suite.class):一套测试集合(suite指一套,使用RunWith测试套件)
- 在Idea环境中,如果不添加额外选项,默认使用JUnit4测试工具来进行测试。因此,@RunWith(SpringRunner.class)和@RunWith(SpringJUnit4ClassRunner.class)在idea环境下是等价的。
测试结果
还有一种情况,测试对数据库的写的操作
- @SpringBootTest
- @RunWith(SpringRunner.class)
- class AddUserServiceImpTest {
- @Autowired
- private AddUserService addUserService;
- @Autowired
- private FindUserByIdService findUserByIdService;
-
- @Test
- @Transactional
- @Rollback
- void addUser(){
- User user = new User();
- user.setUsername("小白");
- user.setUserid(234);
- user.setPassword("414");
- user.setPhonenumber("19196511719");
- addUserService.addUser(user.getUserid(),user.getUsername(),user.getPhonenumber(),user.getPassword(),777);
- System.out.println("+++++++++++++++");
- UserVO userById = findUserByIdService.findUserById(234);
- System.out.println(userById);
- System.out.println("+++++++++++++++");
-
- }
-
- }
测试模块不能真的添加数据到数据库,但需要测试加入数据,所以需要 @Transactional 和@Rollback 注解完成对sql事务和回滚的操作
测试Controller
- @SpringBootTest
- class FindUserByIdControllerTest {
- @Autowired
- private MockMvc mockMvc;
- @Autowired
- private WebApplicationContext webApplicationContext;
- @Test
- void findUserById() {
- mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); //构建请求地址服务
- RequestBuilder request = get("http://localhost:8080/find?userid=150");
- try {
- String response = mockMvc.perform(request).andReturn().getResponse().getContentAsString();
- System.out.println(response);
- }catch (Exception e){
- e.printStackTrace();
- }
- }
- }
需要通过 MockMvc 和 WebApplicationContext 去搭建一个请求地址服务