2015-08-06 14 views
0

У меня есть метод, который я пытаюсь проверить в общественном окончательном классе под названием MyUtil:Почему Whitebox не признает мой частный метод?

private static String getStringFromArray(String[] array) { 
    String tempString = ""; 

    if (array != null && array.length > 0) { 
     for (int i = 0; i < array.length - 1; i++) { 
     tempString += array[i] + ","; 
     } 
     tempString += array[array.length - 1]; 
    } 

    return tempString; 
} 

И у меня есть два метода тестирования, что у меня есть установка с помощью Whitebox, чтобы вызвать этот частный метод:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(MyUtil.class) 
public class MyUtilTests { 

@Before 
public void setUp() { 
    PowerMockito.spy(MyUtil.class); 
} 
    @Test 
    public void getStringFromArrayReturnsEmptyStringIfArrayIsNullTest() throws Exception { 
    String[] arrayOfStrings = null; 
    String retVal = Whitebox.invokeMethod(MyUtil.class, "getStringFromArray", arrayOfStrings); 

    assertEquals("", retVal); 
    } 

    @Test 
    public void getStringFromArrayReturnsElementsSeparatedByCommasTest() throws Exception { 
    String[] arrayOfStrings = new String[]{"A", "B", "C"}; 

    String retVal = Whitebox.invokeMethod(MyUtil.class, "getStringFromArray", arrayOfStrings); 

    assertEquals("A,B,C", retVal); 
    } 
} 

Когда я запустить эти тесты, я получаю сообщение об ошибке, говорящее:

«org.powermock.reflect.exceptions.MethodNotFoundException: Нет метод найден с именем„getStringFromArray“с типами параметров: [java.lang.String, Java .la ng.String, java.lang.String] "

Почему Whitebox распознает метод в первом тесте (с нулевым массивом), но не во втором (где у меня есть фактический массив)? Я должен упомянуть, что я включил @Before spy, который я сделал для этого тестового класса (мне это нужно в других тестах), на случай, если это повлияет на проблему.

+0

Зачем вам нужен шпион здесь!?, Просто использовать реальный объект (сделать метод защищенной) –

+0

Также вы, вероятно, следует использовать https://docs.oracle.com/javase/8/docs/api /java/lang/String.html#join-java.lang.CharSequence-java.lang.CharSequence...- –

+0

Это устаревший код. Я тестирую модуль, и я не должен вносить какие-либо изменения. Я использую шпион в других тестах, которые тестируют методы, которые вызывают другие методы в одном классе. – user3897392

ответ

1

В редакторе Eclipse, я вижу это ниже предупреждения в Whitebox.invokeMethod строке кода

Аргумент типа String [] явно должен быть приведен к Object [] для вызова метода с переменным числом аргументов InvokeMethod (Class, String, Object ...) из типа Whitebox. Это может альтернативно быть отлито на объект для вызова списков параметров

Итак, когда я изменил строку коды, как показано ниже для двух методов испытаний литья типа для объекта при прохождении аргументов, тестовых случаев, выполненных успешно.

String retVal = Whitebox.invokeMethod(MyUtil.class, "getStringFromArray", (Object)arrayOfStrings); 
+0

Это сработало, спасибо! – user3897392