2016-06-08 84 views
0

我使用groovy和junit編寫單元測試。我寫了一個方法testBrandIDParam來測試一些常見的情況,如null參數值或paramID < 0使用反射。但是,當我測試null參數時,此方法並不總是有效。我怎麼解決這個問題?如何使用groovy中的反射調用具有null參數值的方法?

@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: argument type mismatch

  2. CommonRespDTO respDTO = doTestMethod.invoke(service,new Object[1]{ null });
    拋出

    groovy.lang.MissingMethodException: No signature of method: [Ljava.lang.Object;.call() is applicable for argument types: (service.serviceTest$_testBrandIDParam_closure1) values: [[email protected]]
    Possible solutions: tail(), wait(), any(), max(), last(), wait(long)

  3. CommonRespDTO respDTO = doTestMethod.invoke(service,new Object[1]{ null });
    產生編譯錯誤:

    new Objecy[] cannot be applied to groovy.lang.Closure

+0

很難說出你在問什麼,但我最好的猜測是你使用Java數組語法'{}'而不是'[]'爲Groovy。 – chrylis

+0

如何在groovy中使用null參數調用方法? –

回答

3

您需要的Object秒的陣列傳遞到invoke()。這是有點棘手:

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

Thanks.It真的有用。 –

相關問題