Spring3.2 Contorller单元测试参数问题: java.lang.NoSuchMethodException

 使用3.2做单元测试的时候发现这个问题,因为之前都是用3.0中的配置适配器使用AnnotationMethodHandlerAdapter,到3.2中升级为RequestMappingHandlerAdapter;

运行之前的单元测试发现报异常:java.lang.NoSuchMethodException,看了一下堆栈发现反射调用的方法签名明显不对,于是看了一下调用的代码,

之前是:handlerAdapter.handle(request, response,  new HandlerMethod(controller, "setClassBreaksInfo"))

感觉是这里的问,继续看handle的参数,发现还有一个Class<?>... parameterTypes,预计根据这里还匹配调用参数签名的,于是改为跟调用方法签名对应的ClassType,然后可以正确运行了,整体配置如下:

 

Spring3.2 Contorller单元测试参数问题: java.lang.NoSuchMethodException
 1 package com.catt.base;

 2 

 3 import org.junit.runner.RunWith;

 4 import org.springframework.beans.factory.annotation.Autowired;

 5 import org.springframework.mock.web.MockHttpServletRequest;

 6 import org.springframework.mock.web.MockHttpServletResponse;

 7 import org.springframework.test.context.ContextConfiguration;

 8 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

 9 import org.springframework.test.context.transaction.TransactionConfiguration;

10 import org.springframework.transaction.annotation.Transactional;

11 import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;

12 

13 

14 @RunWith(SpringJUnit4ClassRunner.class)  

15 @ContextConfiguration(locations = { "classpath:applicationContext.xml" ,"classpath:spring-servlet.xml"})

16 @Transactional

17 @TransactionConfiguration(defaultRollback = true)  

18 /**

19  * Spring集成Jnuit Action单元测试

20  * @author dgx

21  *    @data 2014-05-19

22  */

23 public abstract class AbstractActionTestCase {

24      @Autowired

25      protected RequestMappingHandlerAdapter  handlerAdapter;  

26       

27      protected  final MockHttpServletRequest request = new MockHttpServletRequest();  

28      protected  final MockHttpServletResponse response = new MockHttpServletResponse();

29      

30      

31      public AbstractActionTestCase()

32      {

33          response.setContentType("text/plain;charset=UTF-8");

34      }

35 }
测试抽象累
Spring3.2 Contorller单元测试参数问题: java.lang.NoSuchMethodException
package com.catt.action;



import static org.junit.Assert.*;



import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;



import org.junit.Test;

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

import org.springframework.web.method.HandlerMethod;

import org.springframework.web.servlet.ModelAndView;



import com.catt.action.pub.GisAction;

import com.catt.base.AbstractActionTestCase;





public class GisTest extends AbstractActionTestCase{

    @Autowired

    private GisAction controller;

    

    @Test

    public void testSetClassBreaksInfo()

    {

        

         request.setRequestURI("/gisAction/setClassBreaksInfo.do");  

         //request.setMethod(HttpMethod.POST.name()); 

         

         request.addParameter("userid", "5802919");

         request.addParameter("gisSqlId", "1");

         request.addParameter("classBreaksType", "2");

         request.addParameter("breaksInfo", "1|0|1|0xFF0000|高倒流栅格1,2|2|3|0xFF0000|高倒流栅格2");

         

         

         HttpSession session = request.getSession();   

            //设置 认证信息   

         session.setAttribute("1", 1);

         

         ModelAndView mv = null;



         try {

             mv = handlerAdapter.handle(request, response,  new HandlerMethod(controller, "setClassBreaksInfo", 

                     String.class,String.class,String.class,String.class,HttpServletResponse.class)); 

         } catch (Exception e) {

             e.printStackTrace();

         }

         

         assertEquals("/setClassBreaksInfo", mv.getViewName());   

    }

}
单元测试
Spring3.2 Contorller单元测试参数问题: java.lang.NoSuchMethodException
<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"

    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd

       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd

       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd

       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">



    <context:annotation-config />

    <context:component-scan base-package="com.catt.action" />  



    

    <bean id="handlerAdapter" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">

        <property name="webBindingInitializer">

            <bean class="util.web.springmvc.BindingInitializer"/>

        </property>

    </bean>



    <bean class="util.web.springmvc.ExceptionResolver">

         <property name="exceptionMappings">

            <props>

                <prop key="java.lang.Exception">/error/500</prop>

            </props>

        </property>

    </bean>



    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>

    <mvc:interceptors>

        <mvc:interceptor>

            <mvc:mapping path="/**" />

            <bean class="util.web.interceptor.AdminLoginInterceptor">

                <property name="loginUrl" value="/login.jsp"/>

                <property name="excludeUrls">

                    <list>

                        <value>/safeMgr/login.do</value>

                        <value>/safeMgr/sendRedirectLogin.do</value>

                        <value>/gisAction/getRenderKpi.do</value>

                        <value>/gisAction/createDataSource.do</value>

                        <value>/gisAction/getClassBreaksInfo.do</value>

                        <!-- 以上GIS和登陆配置是必须的 -->

                    </list>

                </property>

            </bean>

        </mvc:interceptor>

    </mvc:interceptors>

    

    <bean id="multipartResolver"

        class="org.springframework.web.multipart.commons.CommonsMultipartResolver"

        p:defaultEncoding="utf-8" />

        

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

        <property name="prefix">

            <value>/</value>

        </property>

        <property name="suffix">

            <value>.jsp</value>

        </property>

    </bean>

    



    <bean id="SpringBeanUtil" class="util.SpringBeanUtil" />

    

    

    <mvc:annotation-driven>

        <mvc:message-converters register-defaults="true">

            <bean 

                class="org.springframework.http.converter.StringHttpMessageConverter">

                <property name="supportedMediaTypes">

                    <list>

                    <value>text/plain;charset=UTF-8</value>

                    </list>

                </property>

            </bean>

        </mvc:message-converters>

    </mvc:annotation-driven>



</beans>
配置文件

 

你可能感兴趣的:(Spring3.2 Contorller单元测试参数问题: java.lang.NoSuchMethodException)