需求:
使用Mock Mvc单元测试web接口的增删改查、导入、导出功能,涵盖登录 token header赋值等全流程
1,引入核心依赖
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
2,编写登录抽象父类
@Component
public class AbstractControllerTest {
private static final String USER_NO = "xxxx";
private static final String PASSWORD = "xxxx";
private static final String LOGIN_URL_DEV = ConstantsProperties.UAC_HOST+"/xxxx/auth/login";
public static final String FILE_ROOT = System.getProperty("user.dir")+"/src/test/java/com/xxx/xxxx/controller/file";
@Autowired
private WebApplicationContext webApplicationContext;
@Autowired
private ApiGlobalVarsFilter apiGlobalVarsFilter;
public MockMvc mockMvc;
@Autowired
RestTemplate restTemplate;
public String token;
@Before
public void setupMockMvc(){
//获取登录token
LoginRequest request = new LoginRequest();
request.setUserNo(USER_NO);
request.setPassword(PASSWORD);
ResponseEntity<LoginResponse> loginResponseResponseEntity =
restTemplate.postForEntity(LOGIN_URL_DEV, request, LoginResponse.class);
token = loginResponseResponseEntity.getBody().getToken();
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext)
.apply(SecurityMockMvcConfigurers.springSecurity())
.addFilters(apiGlobalVarsFilter).build();
}
}
3,编写单元测试核心类
@ActiveProfiles("dev")
@RunWith(SpringRunner.class)
@SpringBootTest(classes = YmsApplication.class)
@Slf4j
public class TCommTagConfigControllerTest extends AbstractControllerTest{
@Autowired
TCommTagConfigService tCommTagConfigService;
@Test
public void login(){
log.info("登录token为:{}",token);
}
@Test
public void save() throws Exception {
TCommTagConfigReqBody tCommTagConfigReqBody = new TCommTagConfigReqBody();
tCommTagConfigReqBody.setTag("测试1");
tCommTagConfigReqBody.setOwner("test");
String requestBody = JSONUtil.toJsonStr(tCommTagConfigReqBody);
mockMvc.perform(
MockMvcRequestBuilders.post("/v1/tagConfig/save")
.contentType(MediaType.APPLICATION_JSON).content(requestBody)
.header("Authorization",token)
).andDo(MockMvcResultHandlers.print());
}
@Test
public void update() throws Exception {
TCommTagConfigReqBody tCommTagConfigReqBody = new TCommTagConfigReqBody();
tCommTagConfigReqBody.setId(62L);
tCommTagConfigReqBody.setTag("测试11");
tCommTagConfigReqBody.setOwner("test2");
String requestBody = JSONUtil.toJsonStr(tCommTagConfigReqBody);
mockMvc.perform(
MockMvcRequestBuilders.post("/v1/tagConfig/save")
.contentType(MediaType.APPLICATION_JSON).content(requestBody)
.header("Authorization",token)
).andDo(MockMvcResultHandlers.print());
}
@Test
public void delete() throws Exception {
String ids = "63,64";
mockMvc.perform(
MockMvcRequestBuilders.get("/v1/tagConfig/delete?ids="+ids)
.contentType(MediaType.APPLICATION_JSON)
.header("Authorization",token)
).andDo(MockMvcResultHandlers.print());
}
@Test
public void getList() throws Exception {
TCommTagConfigPageReqBody tCommTagConfigPageReqBody = new TCommTagConfigPageReqBody();
tCommTagConfigPageReqBody.setOwner("test");
tCommTagConfigPageReqBody.setTag("测试");
mockMvc.perform(
MockMvcRequestBuilders.post("/v1/tagConfig/getList")
.contentType(MediaType.APPLICATION_JSON).content(JSONUtil.toJsonStr(tCommTagConfigPageReqBody))
.header("Authorization",token)
).andDo(MockMvcResultHandlers.print());
}
@Test
public void exportFile() throws Exception {
TCommTagConfigPageReqBody tCommTagConfigPageReqBody = new TCommTagConfigPageReqBody();
tCommTagConfigPageReqBody.setIsExcel("1").setIsEmpty("0").setIsConfig("1");
tCommTagConfigPageReqBody.setOwner("test");
tCommTagConfigPageReqBody.setTag("测试");
mockMvc.perform(
MockMvcRequestBuilders.post("/v1/tagConfig/export")
.contentType(MediaType.APPLICATION_JSON).content(JSONUtil.toJsonStr(tCommTagConfigPageReqBody))
.header("Authorization",token)
).andDo(result -> {
//保存为文件 文件目录需要自建
File file = new File(FILE_ROOT+"/tag/exportFile.xlsx");
if(!file.exists()){
file.createNewFile();
}
try(FileOutputStream fileOutputStream = new FileOutputStream(file)){
IOUtils.write(result.getResponse().getContentAsByteArray(),fileOutputStream);
}catch (IOException e){
log.error("文件导出失败,异常信息:{}",e.getMessage());
}
//assert
MatcherAssert.assertThat(file.exists(), Matchers.equalTo(true));
MatcherAssert.assertThat(file.length(), Matchers.greaterThan(1024L));
});
}
@Test
public void importFile() throws Exception {
//保存为文件 文件目录需要自建
File file = new File(FILE_ROOT+"/tag/Tag Config.xlsx");
ResultActions resultActions = mockMvc.perform(MockMvcRequestBuilders.fileUpload("/v1/tagConfig/import")
.file(new MockMultipartFile("file", "Tag Config.xlsx",
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
new FileInputStream(file)))
.header("Authorization",token)
);
MvcResult mvcResult = resultActions.andDo(MockMvcResultHandlers.print())
.andExpect(MockMvcResultMatchers.status().isOk()).andReturn();
String result = new String(mvcResult.getResponse().getContentAsByteArray(),"UTF-8");
log.info("==========结果为:{}==========" ,result);
}
}
参照:
MockMVC测试上传文件功能_mockmultipartfile怎么测试上传的excel文件-CSDN博客
SpringBoot基础之MockMvc单元测试 - 知乎 (zhihu.com)
MultipartFile的使用小结 - 邱明成 - 博客园 (cnblogs.com)
设置 MockMvc 和 Spring Security :: Spring Security Reference (springdoc.cn)