首页 > 代码库 > 使用spring配合Junit进行单元测试的总结

使用spring配合Junit进行单元测试的总结

最近公司的项目和自己的项目中都用到了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());    }    }

 

使用spring配合Junit进行单元测试的总结