JUnit+Mockito结合测试Spring MVC Controller

[本文出自天外归云的博客园]

概要简述

利用JUnit结合Mockito,再加上spingframework自带的一些方法,就可以组合起来对Spring MVC中的Controller层进行测试。

测试规范

创建后端测试分支:一定是以开发分支为基础创建,也为通过修改开发代码来调试测试代码创造方便。

创建测试类:测试类名B与待测类名A的关系为B=ATest

测试类上添加注释:@RunWith(MockitoJUnitRunner.class)

测试类中声明:private MockMvc mockMvc;

测试类中待注入service mock的Controller声明上注释:@InjectMocks

测试类中待mock的Service声明上注释:@Mock

测试方法上注释:@Test

常用引用(如果IDE不能自动下载对应maven仓库,则需手动修改pom.xml文件添加引用相应的maven仓库):

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.RunWith;
import org.junit.runner.notification.Failure;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.RequestBuilder;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doThrow;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;

初始化方法标准范例:

@Before
public void setUp() throws Exception {
    MockitoAnnotations.initMocks(this);
    this.mockMvc = MockMvcBuilders.standaloneSetup(声明的controller).build();
}

测试方法标准结构范例:

@Test
public void testSth() throws Exception {
    // 自定义填充
    // Mock依赖
    // 构造请求
    // 执行请求与断言
}

对环境ThreadLocal的填充方法举例:

//填充为空
XXThreadLocalContainer.XXX_THREAD_LOCAL.set(null);
//填充为指定类型对象
A a= new A();
a.setXX("test");
XXThreadLocalContainer.XXX_THREAD_LOCAL.set(a);

对无返回service方法依赖注入的mock方法举例:

doThrow(Exception.class).when(someService).doSomeMethod(any(SomeClassA.class), any(SomeClassB.class), anyString(), anyString(), any(SomeEnum.class));

对有返回service方法依赖注入的mock方法举例:

// 构造mock方法返回的对象
A a = new A();
a.setSomePropertyA(someValueA);
a.setSomePropertyB(someValueB);
// 构造mock方法
doReturn(a).when(someService).doSomeMethod(anyString(), anyString());

利用RequestBuilder构造GET请求举例:

RequestBuilder request = MockMvcRequestBuilders.get(someUrl).requestAttr("someAttrNameA", someValueA).requestAttr("someAttrNameB", someValueB).requestAttr("someAttrNameC", someValueC);

执行请求与断言举例:

mockMvc.perform(request).andDo(print()).andExpect(jsonPath("someFieldName").value(String.valueOf(someFieldValue)));

自定义main函数执行测试:

public static void main(String[] args) {
    Result result = JUnitCore.runClasses(MpResurrectionControllerTest.class);
    for (Failure failure : result.getFailures()) {
        System.out.println(String.format("FAILED : %s", failure.toString()));
    }
    System.out.println(String.format("TEST SUCCESS : %s",    result.wasSuccessful()));
}

猜你喜欢

转载自www.cnblogs.com/LanTianYou/p/9240045.html