method.invoke生成IllegalArgumentException:错误的参数数量

时间:2014-07-16 06:24:13

标签: java easymock

我为一个方法创建了EasyMock测试用例,其中包含method.invoke()。一个测试用例运行正常。第二个应该覆盖第一个“if”条件创建了这个IlegalArguent异常:参数数量错误我不明白哪一个是不正确的。原始代码或测试用例。 请帮忙。

原始代码:

 @RequestMapping(value = "/invoke/{service}/{method}", method = RequestMethod.POST)
public @ResponseBody
Object invokeService(@PathVariable("service") String className,
        @PathVariable("method") String method,
        @RequestParam("ms") String signature,
        @RequestParam("r") String responseType, @RequestBody String[] body)
        throws Exception {
    if (applicationContext != null
            && applicationContext.containsBean(className)) {
        Object obj = applicationContext.getBean(className);
        String temp[] = signature.split(",");
        Object[] arguments = new Object[temp.length];
        Class[] parameterTypes = new Class[temp.length];

        for (int i = 0; i < temp.length; i++) {
            if(temp[i] != null && !temp[i].isEmpty()) {
            Class cls = Class.forName(temp[i]);
            parameterTypes[i] = cls;
            if (temp[i].startsWith("java.lang.")) {
                arguments[i] = body[i];
            } else {
                try {
                    arguments[i] = mapper.readValue(body[i], cls);
                } catch (Exception e) {
                    // e.printStackTrace();
                    arguments[i] = body[i];
                }
            }
            }
        }
        Method m = null;
        if(null !=signature && !signature.isEmpty()) {

            m = obj.getClass().getMethod(method, parameterTypes);
        } else {
            m = obj.getClass().getMethod(method);
        }

        Object response = m.invoke(obj);
        return response;
    } else {
        throw new Exception("ApplicationContext not properly set");
    }
}

测试1(成功):

    @Test
public void testInvokeServiceNotJavaLang() throws Exception{
    Object obj = new Object();
    String[] body ={ "body" };

    EasyMock.expect(applicationContext.containsBean("String")).andReturn(true);
    EasyMock.expect(applicationContext.getBean("String")).andReturn(obj);

    EasyMock.replay(applicationContext);

    moduleInvocation.invokeService("String", "toString","", "responseType",body );
    EasyMock.verify(applicationContext);
}

Test2(IllegalArgumentException:参数数量错误)

    @Test
public void testInvokeService() throws Exception{
    Object obj = new Object();
    String[] body ={ "body" };
    EasyMock.expect(applicationContext.containsBean("Object")).andReturn(true);
    EasyMock.expect(applicationContext.getBean("Object")).andReturn(obj);
    EasyMock.replay(applicationContext);

    moduleInvocation.invokeService("Object", "equals", "java.lang.Object", "responseType",body );
    EasyMock.verify(applicationContext);
}

1 个答案:

答案 0 :(得分:0)

问题在于您的代码。在第一种情况下,您调用的方法String#toString()没有任何参数,并且成功调用它。在第二种情况下,您正在调用期望Object#equals()的{​​{1}}方法,因此您需要在使用one argument时传递该参数值,因此您的代码应为第二种情况

m.invoke()

对于第一种情况,这就足够了

  m.invoke(obj,new Object[]{<object to be compared>});

希望这有帮助。

修改

你应该这样写:

  m.invoke(obj,null);