为什么要单元测试?
如果不单元测试,不知道具体功能代码模块是否正确,只能通过PostMan或者启动项目Http请求去测试功能,而且不能具体测试某个代码块的功能(比如单独测试 FindUserByID 这个功能模块),有单元测试之后程序员可以自己测试自己写的代码功能是否正确。
添加 Pom 文件
<!-- 单元测试-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
测试Service
生成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 去搭建一个请求地址服务