spring 集成測試中 對mock 的集成實在是太棒了!但是使用請注意一下3個條件。
- junit 必須使用4.9以上
- 同時您的框架必須是用spring mvc
- spring 3.2以上才完美支持
目前使用spring MVC 取代struts2 的很多,spring MVC 的各種靈活讓人無比銷魂!所以使用spring MVC吧!
以前在對接口(主要是java服務端提供的接口(一般是:webService,restful))進行測試的中 一般用以下倆種方法。測試流程如圖:
1 直接使用httpClient
這方法各種麻煩
2 使用Spring 提供的RestTemplate
錯誤不好跟蹤,必須開著服務器
使用mockMVC都不是問題了看使用實例:
使用事例如下:父類
Java代碼

- import org.junit.runner.RunWith;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.test.context.ContextConfiguration;
- import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
- import org.springframework.test.context.web.WebAppConfiguration;
- import org.springframework.web.context.WebApplicationContext;
-
- @WebAppConfiguration
- @ContextConfiguration(locations = { "classpath:applicationContext.xml",
- "classpath:xxxx-servlet.xml" })
- public class AbstractContextControllerTests {
-
- @Autowired
- protected WebApplicationContext wac;
-
- }
-
- 子類:
-
- import org.junit.Before;
- import org.junit.Test;
- import org.junit.runner.RunWith;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.http.MediaType;
- import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
- import org.springframework.test.web.servlet.MockMvc;
- import org.springframework.test.web.servlet.setup.MockMvcBuilders;
-
- import com.conlect.oatos.dto.status.RESTurl;
- import com.qycloud.oatos.server.service.PersonalDiskService;
-
- //這個必須使用junit4.9以上才有。
- @RunWith(SpringJUnit4ClassRunner.class)
- public class PersonalDiskMockTests extends AbstractContextControllerTests {
-
-
- private static String URI = RESTurl.searchPersonalFile;
-
- private MockMvc mockMvc;
-
- private String json ="{\"entId\":1234,\"userId\":1235,\"key\":\"new\"}";
-
- @Autowired
- private PersonalDiskService personalDiskService;
-
- @Before
- public void setup() {
- //this.mockMvc = webAppContextSetup(this.wac).alwaysExpect(status().isOk()).build();
- this.mockMvc = MockMvcBuilders.standaloneSetup(personalDiskService).build();
- }
-
- @Test
- public void readJson() throws Exception {
- this.mockMvc.perform(
- post(URI, "json").characterEncoding("UTF-8")
- .contentType(MediaType.APPLICATION_JSON)
- .content(json.getBytes()))
- .andExpect(content().string("Read from JSON: JavaBean {foo=[bar], fruit=[apple]}")
- );
- }
上面是簡單的例子,實際使用起來可以稍做修改。記得導入spring -test jar 包。無需額外配置(是不是很方便!)
當然和junit 的assert 一起用的話效果更好。下面貼點例子。copy就能跑。
Java代碼

- package com.qycloud.oatos.server.test.mockmvcTest;
-
- import static org.junit.Assert.fail;
- import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
-
- import java.io.UnsupportedEncodingException;
- import java.lang.reflect.Field;
-
- import org.springframework.http.MediaType;
- import org.springframework.test.web.servlet.MockMvc;
-
- import com.conlect.oatos.dto.status.CommConstants;
- import com.conlect.oatos.dto.status.ErrorType;
- import com.conlect.oatos.http.PojoMapper;
-
- public class MockUtil {
-
- /**
- * mock
- *
- * @param uri
- * @param json
- * @return
- * @throws UnsupportedEncodingException
- * @throws Exception
- */
- public static String mock(MockMvc mvc, String uri, String json)
- throws UnsupportedEncodingException, Exception {
- return mvc
- .perform(
- post(uri, "json").characterEncoding("UTF-8")
- .contentType(MediaType.APPLICATION_JSON)
- .content(json.getBytes())).andReturn()
- .getResponse().getContentAsString();
- }
-
-
- /**
- *
- * @param re 返回值
- * @param object 要轉換的對象
- * @param testName 當前測試的對象
- */
- public static <T> void check(String re, Class<T> object,String testName) {
- System.out.println(re);
- if (ErrorType.error500.toString().equals(re)) {
- System.out.println("-----該接口測試失敗:-----"
- + testName);
- fail(re);
- } else if (CommConstants.OK_MARK.toString().equals(re)) {
- System.out.println("-----該接口測試成功:-----"
- + testName);
- }else{
- System.out.println("-----re----- :"+re);
- }
- if (object != null) {
- if (re.contains(":")) {
- try {
- T t = PojoMapper.fromJsonAsObject(re, object);
- System.out.println("-----該接口測試成功:-----"
- + testName);
- } catch (Exception e) {
- System.out.println("-----該接口測試失敗:-----"
- + testName);
- fail(e.getMessage());
- }
- }
- }
-
- }
-
-
- /**
- * 初始化版本信息。每次調用測試用力之前首先更新版本信息
- * @param mockMvc
- * @param url
- * @param fileId
- * @param class1
- * @return
- * @throws UnsupportedEncodingException
- * @throws Exception
- */
- public static <T> Long updateVersion(MockMvc mockMvc, String url,
- Long fileId, Class<T> class1) throws UnsupportedEncodingException, Exception {
-
- String re = mock(mockMvc, url, fileId+"");
-
- T dto = PojoMapper.fromJsonAsObject(re, class1);
-
- Long version = Long.parseLong(dto.getClass().getMethod("getVersion").invoke(dto).toString());
- System.out.println("version = "+version);
-
- return version;
-
- }
-
- }
使用如下:
Java代碼

- @RunWith(SpringJUnit4ClassRunner.class)
- public class PersonalDiskMockTests extends AbstractContextControllerTests {
-
- private MockMvc mockMvc;
-
- private static Long entId = 1234L;
- private static Long adminId = 1235L;
-
-
-
-
- @Autowired
- private PersonalDiskService personalDiskService;
-
- @Before
- public void setup() {
- this.mockMvc = MockMvcBuilders.standaloneSetup(personalDiskService)
- .build();
- }
-
- /***
- * pass
- * 全局搜索企業文件
- *
- * @throws Exception
- */
- @Test
- public void searchPersonalFile() throws Exception {
-
- SearchFileParamDTO sf = new SearchFileParamDTO();
- sf.setEntId(entId);
- sf.setKey("li");
- sf.setUserId(adminId);
-
- String json = PojoMapper.toJson(sf);
-
- String re = MockUtil.mock(this.mockMvc, RESTurl.searchPersonalFile,
- json);
- MockUtil.check(re, SearchPersonalFilesDTO.class, "searchPersonalFile");
-
- }
- }
當然@setup里面是每個@test執行時都會執行一次的,所以有些需要每次都實例化的參數可以放進來
如下:
Java代碼

- @Autowired
- private ShareDiskService shareDiskService;
-
- @Before
- public void setup() {
- this.mockMvc = MockMvcBuilders.standaloneSetup(shareDiskService)
- .build();
- try {
- initDatas();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
-
-
- private void initDatas() throws UnsupportedEncodingException, Exception {
- FileIdVersion = MockUtil.updateVersion(mockMvc,RESTurl.getShareFileById,FileId,ShareFileDTO.class);
- File2IdVersion = MockUtil.updateVersion(mockMvc,RESTurl.getShareFileById,File2Id,ShareFileDTO.class);
- oldPicFolderVersion = MockUtil.updateVersion(mockMvc,RESTurl.getShareFolderById,oldPicFolderId,ShareFolderDTO.class);
- }
ok!基本使用大致如此,代碼沒有些注釋,但是很簡單,看懂是沒問題的。權當拋磚引玉。希望大家加以指正!