2012-11-01 6 views
2
private boolean isEmpty(Object[] array) { 
    if (array == null || array.length == 0) 
     return true; 
    for (int i = 0; i < array.length; i++) { 
    if (array[i] != null) 
     return false; 
    }   

    return true; 
} 

@Test 
public void testIsEmpty() { 
     //where is an instance of the class whose method isEmpty() I want to test. 
    try { 
     Object[] arr = null; 
     assertTrue((Boolean)(Whitebox.invokeMethod(where, "isEmpty", new Class<?>[]{Object[].class}, arr))); 

     arr = new Object[0]; 
     assertTrue((Boolean)(Whitebox.invokeMethod(where, "isEmpty", new Class<?>[]{Object[].class}, arr))); 

     arr = new Object[]{null, null}; 
     assertTrue((Boolean)(Whitebox.invokeMethod(where, "isEmpty", new Class<?>[]{Object[].class}, arr))); 

     arr = new Object[]{1, 2}; 
     assertFalse((Boolean)(Whitebox.invokeMethod(where, "isEmpty", new Class<?>[]{Object[].class}, arr))); 
    } catch (Exception e) { 
     fail(e.getMessage()); 
    }  
} 

문제 개체 []를 취득하는 방법이 적절 Whitebox.invokeMethod (...)를 사용하여 다음에 java.lang.AssertionError : 1 인수PowerMock하십시오 PARAM으로

연구 수가 잘못. 처음에 나는 시도했다 : invokeMethod (Object tested, String methodToExecute, Object ... arguments)

두 번째, 세 번째 및 네 번째 invokeMethod()에서는 실패했다. (오류 : 주어진 매개 변수가있는 메서드를 찾을 수 없음)

나는이 방법이 잠재적으로 올바른 방법을 추론하지 못하는 문제로 생각했습니다.

  1. 상위 클래스와 하위 클래스의 오버라이드 된 IsEmpty 함수() 메소드를 갖는다 (클래스 [] argumentTypes 개체 ... 인수 개체 검사 문자열 methodToExecute) invokeMethod : 따라서, I는 전환 정확한 중복 된 isEmpty() 메소드. (레거시 코드) 서명이 다른 isEmpty() 메서드는 없습니다. 매개 변수를 취하는 많은 메소드가 있지만 Object []를 사용하는 메소드는 없습니다 (예 : Integer []를 매개 변수로 사용하는 메소드가 없음).

  2. 위의 두 번째 assertTrue 문 앞에 arr = new Object [1]로 변경하면 해당 assert 문이 통과됩니다.

모든 도움을 주시면 대단히 감사하겠습니다. 감사!

Whitebox.invokeMethod(where, "isEmpty", new Class<?>[]{Object[].class}, (Object) arr); 

테스트 케이스를 :

답변

4

나는 그것은 자바 Object...에 해당하는 인수보다는 배열, 하나의 인자로을 만들기 위해, 객체에 인수를 캐스팅하여 작업을해야한다고 생각 :

public static void main(String[] args) { 
    foo(new Object[] {"1", "2"}); // prints arg = 1\narg=2 
    foo((Object) (new Object[] {"1", "2"})); // prints args = [Ljava.lang.Object;@969cccc 
} 

private static void foo(Object... args) { 
    for (Object arg : args) { 
     System.out.println("arg = " + arg); 
    } 
} 
+0

완벽하게 작동했습니다. 감사. :) – kchang