前言
单元测试是日常开发重要的一环,全面的单元测试能够及时发现bug,为整个系统提供安全可靠的代码单元。当然,作为后端程序,也要进行单元测试才能保证代码的准确性。
新建单元测试
单元测试放在一个类里面,单元测试类和代码类一般一一对应。
进入到代码类,右键类型,点击Go To > Test
。如果没有测试类,提示新建测试类。
注解
进行spring-boot程序单元测试时,需要添加@SpringBootTest
注解,导入测试相关的组件。
进行单元测试时,服务器无需启动。
@SpringBootTest
注解表明这是一个spring-boot单元测试类。
@SpringBootTest
class Task2ApplicationTests {
@Test
void contextLoads() {
}
}
@RunWith(SpringJUnit4ClassRunner.class)
注解表明测试使用Spring容器,并且从容器中注入对象。如果运行过程中报无法注入对象,请添加这个注解。
@RunWith(SpringJUnit4ClassRunner.class)
@Transactional
一般情况下,单元测试调用接口时,如果有数据库操作,会对数据库进行修改。为了只测试接口的逻辑是否正确,可以在测试类上添加@Transactional
注解,这样测试单元的所有修改操作在测试结束后会被还原。
@Transactional
@SpringBootTest
class UserControllerTest {
@Test
void lock() throws Exception {
MockHttpServletResponse result = mockMvc.perform(
MockMvcRequestBuilders.patch("/users/{id}/state", 1)
.param("locked", "true")
).andReturn().getResponse();
System.err.println(result.getStatus() + "|" + result.getContentAsString());
}
}
@TestPropertySource
指定单元测试的属性配置文件。
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = UserApplication.class)
@TestPropertySource(properties = {"classpath:bootstrap.yml"})
public class UserControllerTest {
}
MockMvc
创建MockMvc的方法有两种,可以通过MockMvcBuilders
来创建。
public final class MockMvcBuilders {
public static DefaultMockMvcBuilder webAppContextSetup(WebApplicationContext context) {
return new DefaultMockMvcBuilder(context);
}
public static StandaloneMockMvcBuilder standaloneSetup(Object... controllers) {
return new StandaloneMockMvcBuilder(controllers);
}
}
一种是DefaultMockMvcBuilder
,另外一种是StandaloneMockMvcBuilder
,两种的区别是:
DefaultMockMvcBuilder
需要传入一个上下文WebApplicationContext
,构造器从上下文对象获取控制器。StandaloneMockMvcBuilder
直接传入控制器。
创建请求
使用MockMvcRequestBuilders
对象来创建请求。
MockHttpServletRequestBuilder request = MockMvcRequestBuilders.patch("/users/{id}/state", 1)
.param("locked", "true")
MockMvc执行请求
MockHttpServletResponse response = mockMvc.perform(request).andReturn()
处理结果
response.getStatus()
response.getContentAsString()