2015-11-09 1 views
0

У меня есть вспомогательный класс, который содержит публичного статический метода getProductHandler(String name):Применение Mockito к блоку протестировать функцию, которая содержит статический метод вызова и асинхронная задача

public class ProductHandlerManager { 
    public static Handler getProductHandler(String name) { 
     Handler handler = findProductHandler(name); 
     return handler; 
    } 
} 

CustomerService класса использует выше ProductHandlerManager:

public class CustomerService { 
    ... 
    public void handleProduct() { 
    Handler appleHandler = ProductHandlerManager.getProductHandler("apple"); 
    appleHandler.post(new Runnable() { 
     @Override 
     public void run() { 
      //... 
     } 
    }); 
    } 
} 

Я хочу провести тестирование handleProduct() метод в CustomerService класс. Я попытался использовать mockito, чтобы высмеять часть ProductManager.getProductHandler("apple") в тесте, однако mockito не поддерживает статический метод, издевательский. Как я могу использовать Mockito для тестирования модуля handleProduct()?

Пожалуйста, не предлагайте мне использовать Powermock, так как я прочитал статью, в которой говорится, что если мне нужно издеваться над статическим методом, это указывает на плохой дизайн. Но я могу принять предложения по рефакторингу кода, чтобы сделать его проверяемым.

+0

Этот вопрос уже ответил в вашем исходном вопросе http://stackoverflow.com/questions/33606719/missingmethodinvocationexception-from-mockito-when-do-unit-test/33606767?noredirect=1#comment54994764_33606767. Сделайте его экземпляром (не статическим) методом. –

+0

Я хотел бы посмотреть, есть ли альтернативное решение (сохраняйте этот метод статическим). Например. через рефакторинг кода – user842225

+1

Нет, нет. Вы можете изменить метод на нестатический, использовать PowerMock (не рекомендуется), или вы могли бы создать метод делегата, отличный от экземпляра, и высмеять его вместо этого (обычно работайте при работе с устаревшим кодом). –

ответ

0

Вы можете реорганизовать и указать обработчик самостоятельно. Они часто могут быть закрытыми для пакета, если вы ставите свои тесты в том же пакете, что и ваши классы под тестом, даже если они находятся в другой исходной папке (например, src vs testsrc). Guava (Google Commons) имеет удобный @VisibleForTesting documentation annotation, хотя Javadoc также работает.

public class CustomerService { 
    public void handleProduct() { 
    handle(ProductHandlerManager.getProductHandler("apple")); 
    } 

    /** Visible for testing. */ 
    void handleProduct(Handler handler) { 
    handler.post(new Runnable() { 
     @Override 
     public void run() { 
      //... 
     } 
    }); 
    } 
} 

На данный момент, вы можете проверить handleProduct(Handler) интенсивно, как модульное тестирование, то только тест handleProduct() в качестве интеграционного теста, чтобы обеспечить «яблочный» обработчик продукт взаимодействует правильно.

Смежные вопросы