我为一个方法创建了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);
}
答案 0 :(得分:0)
问题在于您的代码。在第一种情况下,您调用的方法String#toString()
没有任何参数,并且成功调用它。在第二种情况下,您正在调用期望Object#equals()
的{{1}}方法,因此您需要在使用one argument
时传递该参数值,因此您的代码应为第二种情况
m.invoke()
对于第一种情况,这就足够了
m.invoke(obj,new Object[]{<object to be compared>});
希望这有帮助。
修改强>
你应该这样写:
m.invoke(obj,null);