您的位置:首页 > 运维架构 > Apache

Apache Ant+Junit对Java(Spring MVC(基于注解))工程进行测试(二)

2013-12-27 15:24 477 查看
前言:关于Ant+Junit对Spring MVC(基于注解)的工程测试,网上有很多资料,感谢这些网友提供的资料。

首先声明:本文的重点在于spring mvc工程的测试用例以及其基础类的编写,关于Ant自动测试的代码在Ant+Junit测试(一)中以及做了详细的介绍。

下面将自己测试的项目及其过程形成相应的文档。

一、生成关于的Spring MVC 的DEMO项目,见如下CSDN资料链接:http://download.csdn.net/detail/limingzhong198/6758493

1、环境介绍:

JDK:1.6;

TOMCTA:6.0.18(安装版);

Spring:3.x;

二、关于Spring MVC 的测试分三层,分别为:Controller层、Service层、Dao层。

1、建立测试相关的目录:testsrc,如下图所示;



2、从图上可以看出来,建立了跟mvc模式一样的三层架构模式,下面详细的介绍一下这三层的测试过程;

A:Controller层:

在Controller层,大家都知道,这是分发http请求的功能层,在这一层中,最主要的就是封装好相关的http请求参数,包括:HandlerMapping、HandlerAdapter等。在实际的项目,我们一般都会写一个Controller层的基础类,在后面的实际测试类中,只有继承该基础类即可,JUnitControllerBase.java内容:

package com.test.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.junit.BeforeClass;
import org.springframework.mock.web.MockServletContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.XmlWebApplicationContext;
import org.springframework.web.servlet.HandlerAdapter;
import org.springframework.web.servlet.HandlerExecutionChain;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter;
import org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping;

public class JUnitControllerBase {

private static HandlerMapping handlerMapping;
private static HandlerAdapter handlerAdapter;

@BeforeClass
public static void setUp() {
if (handlerMapping == null) {
String[] configs = {"file:WebContent/WEB-INF/conf/applicationContext.xml","file:WebContent/WEB-INF/spring-servlet.xml"};
XmlWebApplicationContext context = new XmlWebApplicationContext();
context.setConfigLocations(configs);
MockServletContext msc = new MockServletContext();
context.setServletContext(msc);
context.refresh();
msc.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, context);
handlerMapping = (HandlerMapping)context.getBean(DefaultAnnotationHandlerMapping.class);
handlerAdapter = (HandlerAdapter)context.getBean(context.getBeanNamesForType(AnnotationMethodHandlerAdapter.class)[0]);
}
}

public ModelAndView excuteController(HttpServletRequest request, HttpServletResponse response) throws Exception {
HandlerExecutionChain chain = handlerMapping.getHandler(request);
final ModelAndView model = handlerAdapter.handle(request, response, chain.getHandler());
return model;
}
}

从基础类的代码中,我们可以看到,封装了相关测试需要的基础参数:HandlerMapping、HandlerAdapter,以及包括相关涉及到的配置文件载入。

看实际的Controller层测试类:TestUserController.java:

package com.test.controller;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.web.servlet.ModelAndView;

public class TestUserController extends JUnitControllerBase{
@Test
public void testUserController() throws Exception {
MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpServletResponse response = new MockHttpServletResponse();
request.setRequestURI("/index.htm");
request.setMethod("POST");
final ModelAndView mav = this.excuteController(request, response);
Assert.assertEquals("test", mav.getViewName());
}
}

从实际测试类的代码中可以看到,我们的测试类继承了相关的基础类,这样我们就只需要关注具体测试类的测试用例代码的编写,省去了不少时间成本。

B:Service层:

Service层的测试类编写跟Controller层比较类似,所以直接贴代码:JunitServiceBase.java类

package com.test.service;

import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"file:WebContent/WEB-INF/conf/applicationContext.xml","file:WebContent/WEB-INF/spring-servlet.xml"})
public class JunitServiceBase extends AbstractJUnit4SpringContextTests {

}

Service层实际测试类:TestUserService.java类:

package com.test.service;

import java.sql.SQLException;

import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

import com.pro.bean.User;
import com.pro.service.UserService;

public class TestUserService extends JunitServiceBase{

@Autowired
private UserService userService;

@Test
public void testUserService() throws ClassNotFoundException, SQLException {
userService.insert(new User(25,"aaa"));
}
}

C:Dao层:

Dao的测试类编写跟Controller层比较类似,所以直接贴代码:JunitDaoBase.java类:

package com.test.dao;

import javax.annotation.Resource;
import javax.sql.DataSource;

import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"file:WebContent/WEB-INF/conf/applicationContext.xml","file:WebContent/WEB-INF/spring-servlet.xml"})
public class JunitDaoBase extends AbstractTransactionalJUnit4SpringContextTests {

@Override
@Resource(name = "dataSource")
public void setDataSource(DataSource dataSource) {
super.setDataSource(dataSource);
}
}

Dao层实际测试类:TestUserDao.java类:

package com.test.dao;

import java.sql.SQLException;
import java.util.List;

import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import com.pro.bean.User;
import com.pro.dao.UserDao;

public class TestUserDao extends JunitDaoBase {

@Autowired
private UserDao userDao;

@Test
public void testUserDao() throws ClassNotFoundException, SQLException {
List<User> list = userDao.getAllUser();
int size = list.size();
for(int index=0;index<size;index++){
System.out.println(list.get(index).getUserId()+"^"+list.get(index).getUserName());
}
}
}

3、工具类:RunAllUtilTestsSuite.java

关于工具类的作用,在Ant+Junit测试(一)的文档中已经介绍,不再做任何的介绍,只是将测试代码贴出来:

package com.test.util;

import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import com.test.controller.TestUserController;
import com.test.dao.TestUserDao;
import com.test.service.TestUserService;
/**
* @author limingzhong
* @desc the method of test with making package
*/

@RunWith(Suite.class)
@Suite.SuiteClasses({
TestUserController.class,
TestUserDao.class,
TestUserService.class
})
public class RunAllUtilTestsSuite {}

4、关于Ant的自动测试功能,同样在Ant+Junit测试(一)中做了详细的介绍,所以不再赘述。

5、最终的效果如下资源链接,有兴趣的可以去下载,都是在上面发布的环境中测试通过的,http://download.csdn.net/detail/limingzhong198/6777705

介绍完毕。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: