zoukankan      html  css  js  c++  java
  • 使用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());
        }
        
    
    }
  • 相关阅读:
    Vue生命周期
    脚本生命周期
    音频
    光照系统
    InstantOC(对象渲染---游戏优化)
    kafka单机环境配置以及基本操作
    mysql 锁机制
    java.math.BigDecimal类multiply的使用
    去掉返回的json中特殊字符
    TheadLocal与synchronized
  • 原文地址:https://www.cnblogs.com/jiaoyiping/p/4251759.html
Copyright © 2011-2022 走看看