[本文出自天外归云的博客园]
利用JUnit结合Mockito,再加上spingframework自带的一些方法,就可以组合起来对Spring MVC中的Controller层进行测试。
在设计测试用例前,我们要对待测Controller的代码逻辑进行逐层深入的走查。走查的目的是要明确Controller中主要逻辑分支,以便设计测试用例进行覆盖。一些主要通用的关注点有:
1. 请求request中所包含的参数值(Controller中从请求中获取的参数)
2. Controller中的try块中能够引起异常的方法调用
3. Controller中的if语句涉及的变量值
4. 一些ThreadLocal方法(在实际测试过程中需要对ThreadLocal对象做一些操作来模拟一些状态)
创建后端测试分支:一定是以开发分支为基础创建,也为通过修改开发代码来调试测试代码创造方便。
创建测试类:测试类名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())); }
JUnit+Mockito结合测试Spring MVC Controller
原文:https://www.cnblogs.com/LanTianYou/p/9240045.html