最近公司的項目和自己的項目中都用到了spring集成junit進行單元測試,總結一下幾種基本的用法:
1.直接對spring中注入的bean進行測試(以DAO為例):
在測試類上添加@RunWith注解指定使用springJunit的測試運行器,@ContextConfiguration注解指定測試用的spring配置文件的位置
之后我們就可以注入我們需要測試的bean進行測試,Junit在運行測試之前會先解析spring的配置文件,初始化spring中配置的bean
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations={"classpath*:spring-config-test.xml"}) public class TestProjectDao { @Autowired ProjectDao projectDao;
@Test public void testCreateProjectCode(){ long applyTime = System.currentTimeMillis(); Timestamp ts = new Timestamp(applyTime); Map codeMap = projectDao.generateCode("5", "8",ts,"院內"); String projectCode = (String)codeMap.get("_project_code"); Timestamp apply_time = (Timestamp)codeMap.get("_apply_time"); System.out.print(projectCode); System.out.print(apply_time.toString()); Assert.assertTrue(projectCode.length()==12); }
2.對springMVC進行測試:
spring3.2之后出現了org.springframework.test.web.servlet.MockMvc 類,對springMVC單元測試進行支持
樣例如下:
package com.jiaoyiping.baseproject; import com.jiaoyiping.baseproject.privilege.controller.MeunController; import com.jiaoyiping.baseproject.training.bean.Person; import junit.framework.Assert; 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.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.servlet.ModelAndView; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; /** * Created with IntelliJ IDEA. * User: 焦一平 * Date: 14-9-25 * Time: 下午6:45 * To change this template use File | Settings | File Templates. */ @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration //@ContextConfiguration(classes = {WebMvcConfig.class, MockDataConfig.class}) @ContextConfiguration(locations={"classpath:/spring/applicationContext.xml", "classpath*:mvc-dispatcher-servlet.xml"}) public class TestMockMvc { @Autowired private org.springframework.web.context.WebApplicationContext context; MockMvc mockMvc; @Before public void before() { //可以對所有的controller來進行測試 mockMvc = MockMvcBuilders.webAppContextSetup(context).build(); //僅僅對單個Controller來進行測試 // mockMvc = MockMvcBuilders.standaloneSetup(new MeunController()).build(); } @Test public void testGetMenu(){ try { System.out.println("----------------------------"); ResultActions actions = this.mockMvc.perform(get("/menu/manage.action")); System.out.println(status());// System.out.println(content().toString()); actions.andExpect(status().isOk()); // actions.andExpect(content().contentType("text/html")); System.out.println("----------------------------"); } catch (Exception e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } } //從controller里直接增加用戶(用POST的方式) //post("路徑").param("屬性名","屬性值"); 用這種方法來構造POST @Test public void addPerson(){try { ResultActions resultActions = this.mockMvc.perform(post("/person/add") .param("name","用友軟件") .param("age","23") .param("address","北京市永豐屯") ); resultActions.andExpect(status().isOk()); } catch (Exception e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } } //得到Controller層返回的ModelAndView的方法:resultActions.andReturn().getModelAndView().getModel().get("person"); @Test public void getPerson(){ String id ="297e5fb648b0e6d30148b0e6da6d0000";try { ResultActions resultActions = this.mockMvc.perform(post("/person/toEditPerson").param("id",id)).andExpect(status().isOk()); Assert.assertEquals(23,((Person)(resultActions.andReturn().getModelAndView().getModel().get("person"))).getAge()); Person person =(Person)(resultActions.andReturn().getModelAndView().getModel().get("person")); System.out.println(person.getId()); System.out.println(person.getName()); System.out.println(person.getAge()); System.out.println(person.getAddress()); Assert.assertEquals(23,person.getAge()); } catch (Exception e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } } }
3.測試RestEasy提供的接口(當使用restEasy提供的rest類型接口的時候會用到)
RestEasy提供了 org.jboss.resteasy.core.Dispatcher類來模擬http請求,並返回數據
這樣,在測試接口的時候就不必啟動容器了
代碼如下
/** * cn.cmri.pds.controller.TestProjectTagController.java * Copyright (c) 2009 Hewlett-Packard Development Company, L.P. * All rights reserved. */ package cn.cmri.pds.controller; import java.net.URISyntaxException; import javax.servlet.http.HttpServletResponse; import org.jboss.resteasy.core.Dispatcher; import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.Assert; import org.junit.Before; import org.junit.Test; 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 cn.cmri.pds.project.controllor.ProjectTagControllor; import cn.cmri.pds.project.service.ProjectTagService; /** * <pre> * Desc: * @author 焦一平 * @refactor 焦一平 * @date 2014年12月10日 下午3:44:03 * @version 1.0 * @see * REVISIONS: * Version Date Author Description * ------------------------------------------------------------------- * 1.0 2014年12月10日 焦一平 1. Created this class. * </pre> */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath*:spring-config-test.xml" }) public class TestProjectTagController { @Autowired ProjectTagService projectTagService; Dispatcher dispatcher; @Before public void before() { ProjectTagControllor projectTagControllor = new ProjectTagControllor(); projectTagControllor.setProjectTagService(projectTagService); dispatcher = MockDispatcherFactory.createDispatcher(); dispatcher.getRegistry().addSingletonResource(projectTagControllor); } @Test public void testProjectTags() throws URISyntaxException{ MockHttpRequest request = MockHttpRequest.get("/rest/project/123456/tags"); MockHttpResponse response = new MockHttpResponse(); dispatcher.invoke(request, response); Assert.assertEquals(HttpServletResponse.SC_NOT_FOUND, response.getStatus()); Assert.assertEquals("指定的項目不存在", response.getContentAsString()); } }