суббота, 5 мая 2012 г.

Тестирование private методов (Java)

Приватные методы должны тестироваться. Поначалу это может показаться нетривиальной задачей. Простой способ: использование рефлексии.
private Object invokePrivateMethod (Object test, String methodName, Object params[]) throws Exception {
   Object ret = null;
 
   final Method[] methods =
           test.getClass().getDeclaredMethods();
   for (int i = 0; i < methods.length; ++i) {
       if (methods[i].getName().equals(methodName)) {
           methods[i].setAccessible(true);
           ret = methods[i].invoke(test, params);
           break;
       }
   }
   return ret;
}
В вышеприведенном коде мы:
  • получаем массив определенных методов
  • пробегаем по массиву в поисках того метода, который хотим протестировать
  • найдя метод, делаем его public
  • исполняем метод и получаем результат
Пример использования:
MyClass instance = new MyClass();
String expResult = "Expected Result";
Object[] params = {"A String Value", "Another Value"};
String result = (String) this.invokePrivateMethod(instance, "myPrivateName", params);
assertEquals(expResult, result);
Upd: Все это и гораздо больше может PowerMock с Mockito и JUnit. Крайне рекомендую.

4 комментария:

  1. Обсуждение идет в DevProCommunity https://www.facebook.com/groups/devpro/ , можно и тут

    ОтветитьУдалить
  2. Сейчас начнется холивор на тему тестирования приватных методов...

    ОтветитьУдалить
  3. Кстати да. Не понимаю, зачем их тестировать. protected еще куда ни шло, но private?

    ОтветитьУдалить
  4. затем, чтобы понимать, где именно сломалось.

    ОтветитьУдалить