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()에서는 실패했다. (오류 : 주어진 매개 변수가있는 메서드를 찾을 수 없음)
나는이 방법이 잠재적으로 올바른 방법을 추론하지 못하는 문제로 생각했습니다.
상위 클래스와 하위 클래스의 오버라이드 된 IsEmpty 함수() 메소드를 갖는다 (클래스 [] argumentTypes 개체 ... 인수 개체 검사 문자열 methodToExecute) invokeMethod : 따라서, I는 전환 정확한 중복 된 isEmpty() 메소드. (레거시 코드) 서명이 다른 isEmpty() 메서드는 없습니다. 매개 변수를 취하는 많은 메소드가 있지만 Object []를 사용하는 메소드는 없습니다 (예 : Integer []를 매개 변수로 사용하는 메소드가 없음).
위의 두 번째 assertTrue 문 앞에 arr = new Object [1]로 변경하면 해당 assert 문이 통과됩니다.
모든 도움을 주시면 대단히 감사하겠습니다. 감사!
Whitebox.invokeMethod(where, "isEmpty", new Class<?>[]{Object[].class}, (Object) arr);
테스트 케이스를 :
완벽하게 작동했습니다. 감사. :) – kchang