`
蛤蟆仙人
  • 浏览: 113889 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

junit 测试spring mvc Controller

 
阅读更多

Controller

 

@Controller
public class DataSourceService  {

  @RequestMapping(value = "/bb/aa/{dataSource}", method = RequestMethod.GET)
    public void datasource(HttpServletRequest request, HttpServletResponse response,
            @PathVariable("dataSource") String dataSource) throws Exception {
        String result = "结果为";
        
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.write(result + dataSource);
        out.close();
        
    }
}

测试的基类

 

import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;

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;

/**
 * @ClassName: JUnitActionBase
 * @Description: 这里用一句话描述这个类的作用
 *
 */
public class JUnitActionBase {
    private static HandlerMapping handlerMapping;
    private static HandlerAdapter handlerAdapter;
    
    /** 
     * 读取spring3 MVC配置文件 
     * @throws UnsupportedEncodingException 
     */
    @BeforeClass
    public static void setUp() throws UnsupportedEncodingException {
        if (handlerMapping == null) {
            File file = new File(Thread.currentThread().getContextClassLoader().getResource("").getPath());
            String separator = File.separator;
            String path = URLDecoder.decode(file.getAbsolutePath(), "utf-8").replace("", "").replace("\\", "/");
            String[] configs = { "file:" + path + separator + "hy-spring-servlet.xml",
                    "file:" + path + separator + "hy-spring.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]);
        }
    }
    
    /** 
     * 执行request对象请求的action 
     *  
     * @param request 
     * @param response 
     * @return 
     * @throws Exception 
     */
    public ModelAndView excuteAction(HttpServletRequest request, HttpServletResponse response) throws Exception {
        HandlerExecutionChain chain = handlerMapping.getHandler(request);
        final ModelAndView model = handlerAdapter.handle(request, response, chain.getHandler());
        return model;
    }
}

 测试类

 

public class DataSourceServiceTest extends JUnitActionBase {

    @Test
    public void testJSONDataSourceServiceSQL() throws Exception {
        
        MockHttpServletRequest request = new MockHttpServletRequest();
        MockHttpServletResponse response = new MockHttpServletResponse();
        
        request.setRequestURI("/bb/aa/hehe");
        
        request.addParameter("P_RQ", "2011-11-29");
        
        request.setMethod("GET");
        
        // 执行URI对应的action  
        this.excuteAction(request, response);
        String result = response.getContentAsString();
        Assert.assertNotNull(result);
        
    }
}
分享到:
评论
7 楼 flying3615 2014-04-19  
在spring305上也遇到了这个exception,耽误了好半天
结果发现是需要在springmvc的配置文件里指定
<mvc:default-servlet-handler default-servlet-name="DMS_MVC"/>

DMS_MVC就是web.xml里面default的servletname,好像也可以随便给个
spring DefaultServletHttpRequestHandler api有下面这个话
估计是load web.xml的时候没读进来这个default name
In most cases, the defaultServletName does not need to be set explicitly, as the handler checks at initialization time for the presence of the default Servlet of well-known containers such as Tomcat, Jetty, Resin, WebLogic and WebSphere. However, when running in a container where the default Servlet's name is not known, or where it has been customized via server configuration, the defaultServletName will need to be set explicitly.
6 楼 limcosln1andx 2012-08-03  
哎,我自己的那个controller test 基本和 http://xebee.xebia.in/2012/05/22/spring-mvc-controller-testing-the-right-and-easy-way/ 文章中的第一种方法差不多。不过封装了一个基类。
最近,又突然发现了个问题,直接使用handlderMapping查找handler处理请求,会漏掉很多东西,例如interceptor,事务管理等。越搞越复杂哎。
想了想,还是用spring-test-mvc比较好。
我打算再深入研究一下,还有很多问题,比如测试数据导入和清空,测试时模拟用户登陆。希望能解决这些问题,在分享给大家。 
5 楼 cricket1981 2012-06-27  
其实测试spring mvc controller有一个更好更简洁的办法,参考http://xebee.xebia.in/2012/05/22/spring-mvc-controller-testing-the-right-and-easy-way/
4 楼 蛤蟆仙人 2012-06-25  
把你的分享下  呵呵
3 楼 limcosln1andx 2012-06-18  
问题解决啦,感谢楼主啦,我研究了spring源码,封装了一个功能更多的测试基类,支持我们写的spring controller的测试
2 楼 蛤蟆仙人 2012-05-15  
检查下 应该是配置文件的错误吧?
1 楼 limcosln1andx 2012-05-08  
好文章啊!
不过我照着做的时候报错,帮忙看一下哪的问题把(我对spring的原理不熟)

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler#0': Initialization of bean failed; nested exception is java.lang.IllegalStateException: Unable to locate the default servlet for serving static content. Please set the 'defaultServletName' property explicitly.
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:290)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:192)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
at com.ginkgocap.ywxt.utils.JUnitActionBase.setUp(JUnitActionBase.java:49)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.IllegalStateException: Unable to locate the default servlet for serving static content. Please set the 'defaultServletName' property explicitly.
at org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler.setServletContext(DefaultServletHttpRequestHandler.java:104)
at org.springframework.web.context.support.ServletContextAwareProcessor.postProcessBeforeInitialization(ServletContextAwareProcessor.java:75)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:394)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1413)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
... 24 more

相关推荐

Global site tag (gtag.js) - Google Analytics