mock单元测试

使用场景:

提示:做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版权协议,转载请附上原文出处链接和本声明。