我使用groovy和junit编写单元测试。我编写了一个方法testBrandIDParam
来测试一些常见案例,例如null
参数值或paramID < 0
使用反射。但是,当我测试null
param时,此方法并不总是有效。我该如何解决这个问题?
@Test
public void testGetDetailBrand() {
GetDetailReqDTO reqDTO = new GetDetailReqDTO();
testBrandIDParam(reqDTO, service, "getDetailBrand");
}
private <T> void testBrandIDParam(T requestDTO, Service service, String testMethod) {
Class requestClazz = requestDTO.getClass();
Class serviceClazz = service.getClass();
java.lang.reflect.Method doTestMethod = serviceClazz.getMethod(testMethod, requestDTO.class);
// test null
CommonRespDTO respDTO = doTestMethod.invoke(service,{null });
Assert.assertTrue(respDTO.getRespCode() == ICommonRespDTO.ResponseCode.FAIL.getCode());
T reqInstance = (T) requestClazz.newInstance();
// req-ID = 0
respDTO = (CommonRespDTO) doTestMethod.invoke(service, reqInstance)
Assert.assertTrue(!respDTO.isSuccess());
brandIDField.setAccessible(false);
}
注意:getDetailBrand()
只有一个参数brandID
。
CommonRespDTO respDTO = doTestMethod.invoke(service,{null });
抛出
java.lang.IllegalArgumentException:参数类型不匹配
CommonRespDTO respDTO = doTestMethod.invoke(service,new Object[1]{ null });
抛出
groovy.lang.MissingMethodException:没有方法签名:[Ljava.lang.Object; .call()适用于参数类型:(service.serviceTest $ _testBrandIDParam_closure1)值:[service.serviceTest$_testBrandIDParam_closure1@28236ebc] <登记/> 可能的解决方案:tail(),wait(),any(),max(),last(),wait(long)
CommonRespDTO respDTO = doTestMethod.invoke(service,new Object[1]{ null });
产生编译错误:
新的Objecy []无法应用于groovy.lang.Closure
答案 0 :(得分:3)
您需要将Object
的数组传递给invoke()
。这有点棘手:
doTestMethod.invoke(service, [null] as Object[])