如何使用groovy中的反射调用具有null参数值的方法?

时间:2016-06-08 09:15:38

标签: java reflection groovy

我使用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

  1. CommonRespDTO respDTO = doTestMethod.invoke(service,{null });
    抛出

      

    java.lang.IllegalArgumentException:参数类型不匹配

  2. 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)

  3. CommonRespDTO respDTO = doTestMethod.invoke(service,new Object[1]{ null });
    产生编译错误:

      

    新的Objecy []无法应用于groovy.lang.Closure

1 个答案:

答案 0 :(得分:3)

您需要将Object的数组传递给invoke()。这有点棘手:

doTestMethod.invoke(service, [null] as Object[])