2015-04-03 2 views
1

Я издевался над статическим методом класса, использующего Powermock в моем тестовом классе. Проблема, с которой я сталкиваюсь, заключается в том, что этот статический метод не вызывается непосредственно в моем тестовом классе, а в каком-то другом классе. Вот скелет:Передача издевающегося статического метода в другой класс

@Test public void myTest() { 
    PowerMockito.mockStatic(MyClassWithStaticMethod.class); 
    PowerMockito.when(MyClassWithStaticMethod.staticMethod()).thenReturn("..."); 
    List<String> details = MyHelperClass.getDetails(); 
    ... 
    ... 
} 

Теперь MyHelperClass.getDetails вызывает метод, который должен быть издевались, как это зависит от службы.

MyHelperClass.java

public static List<String> getDetails() { 
    ... 
    ... 
    MyObj obj = MyClassWithStaticMethod.staticMethod(); //This needs to return mocked value 
    ... 
    ... 
} 

Есть ли способ, чтобы передать высмеивал объект вспомогательного класса? PowerMockito.mockStatic возвращает void, где PowerMockito.mock не издевается над статическими методами. Таким образом, я не могу понять, как передать обманутый объект методу вспомогательного класса getDetails().

ответ

1

PowerMock на самом деле не способен на то, чего вы готовы достичь. Там другая структура насмешливый, что может насмехаться буквально почти все по инструментирование байткода - JMockit

Как для вашей проблемы - возможно that поможет

+0

Спасибо тонну! Сначала я не решался использовать JMockit, поскольку mockito уже использовался, и я хотел найти решение, используя PowerMock с mockito. Я столкнулся с несколькими проблемами, связанными с запуском JMockit - мне пришлось обновить мой Junit до 4.12, поскольку JMockit поддерживает только JUnit 4.5+ (это плюс, но я надеюсь, что тесты Junit 4.4 в нашем коде не имеют того, что не поддерживается в 4.12). Но все проблемы были вполне достойны, чтобы подружиться с такой красотой, что JMockit! :) – Pankaj

+0

Youre welcome :) – jdevelop

+0

Тест должен быть проще писать с помощью JMockit, но он также должен отлично работать с PowerMock. Интересно, забыл ли OP использовать '@ PrepareForTest' на тестовом классе? –

0

Только простое примечание относительно статических методов - так как этот вид методов труднее заглушки, и поскольку их укусы могут потенциально повлиять на другие тесты, я рекомендую добавлять для них единичные тесты и полагаться на эти тесты вместо того, чтобы пытаться удостовериться, что метод вызван.

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

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