使用场景:
提示:做sonar单元测试覆盖率时,使用mock的方式生成单元测试用例:
例如:针对controller层的接口做单元测
controller接口代码(查询操作):
@RequestMapping(value = "/getByDtraceJobName", method = RequestMethod.POST)
public Object getByDtraceJobName(@RequestParam(value = "jobName", required = false) String jobName) {
Map<String, Object> result = new HashMap<String, Object>();
result.put("status", "000");
result.put("message", "操作成功!当前任务名可以新建");
try {
if(StringUtils.isBlank(jobName)){
result.put("status", "999");
result.put("message", "操作失败,jobName的值不能为空!");
return result;
}
QueryCriteria criteria = new QueryCriteria();
criteria.put("jobName", jobName);
//先判断任务名是否重复
Map<String, Object> dtraceJob = iDtraceJobInfoManager.getByDtraceJobName(criteria);
if(dtraceJob!=null){
//如果任务存在那么就提示当前任务已存在
result.put("status", "999");
result.put("message", "操作失败,当前任务名已存在!");
return result;
}
} catch (Exception e) {
logger.error("操作失败:", e);
result.put("status", "999");
result.put("message", "操作失败!");
}
return result;
}
mock操作(打桩,说白了就是模拟返回数据):
根据测试类引入相关依赖,,看情况引入:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>1.4.2.RELEASE</version>
<scope>test</scope>
</dependency>
mock测试类实例:
判断接口方法的每个分支,以便提高
sonar覆盖率:
先搭建好测试类
import com.gmcc.project.core.model.QueryCriteria;
import com.gmcc.project.modules.dtracejobinfo.manager.IDtraceJobInfoManager;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
import java.util.*;
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {com.gmcc.project.controllers.DevelopMain.class})
public class DtraceJobInfoControllerTest {
@Autowired
private WebApplicationContext webApplicationContext;
private MockMvc mockMvc;
@Before
public void before(){
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}
//以mock的方式注入需要测试的bean
}
1)模拟返回有结果的情况:
@Test
public void testGetByDtraceJobName() throws Exception {
// Setup 模拟返回的数据
when(mockIDtraceJobInfoManager.getByDtraceJobName(any(QueryCriteria.class))).thenReturn(new HashMap<>());
// Run the test
final MockHttpServletResponse response = mockMvc.perform(post("/dtracejobinfo/getByDtraceJobName")
.param("jobName", "jobName")
.accept(MediaType.APPLICATION_JSON))
.andReturn().getResponse();
// Verify the results
assertEquals(HttpStatus.OK.value(), response.getStatus());
System.out.println(response.getContentAsString());
}
2)模拟返回空的情况:
@Test
public void testGetByDtraceJobName_2() throws Exception {
// Setup
when(mockIDtraceJobInfoManager.getByDtraceJobName(any(QueryCriteria.class))).thenReturn(Collections.EMPTY_MAP);
// Run the test
final MockHttpServletResponse response = mockMvc.perform(post("/dtracejobinfo/getByDtraceJobName")
.param("jobName", "")
.accept(MediaType.APPLICATION_JSON))
.andReturn().getResponse();
// Verify the results
assertEquals(HttpStatus.OK.value(), response.getStatus());
System.out.println(response.getContentAsString());
}
3)模拟抛出异常的情况:
@Test
public void testGetByDtraceJobName_2() throws Exception {
// Setup
when(mockIDtraceJobInfoManager.getByDtraceJobName(any(QueryCriteria.class)))
.thenThrow(new RuntimeException());
// Run the test
final MockHttpServletResponse response = mockMvc.perform(post("/dtracejobinfo/getByDtraceJobName")
.param("jobName", "")
.accept(MediaType.APPLICATION_JSON))
.andReturn().getResponse();
// Verify the results
System.out.println(response.getContentAsString());
}
以上是mock的使用方式,增删改也是一样的操作,
传入any(类型),return模拟的数据,
不对实际的数据库表数据产生影响
版权声明:本文为weixin_43920527原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。