Попытка заглушить класс активности Android с помощью PowerMockito выдает исключение RuntimeException "Stub!" - PullRequest
9 голосов
/ 18 сентября 2010

Я нашел этот пример , где они использовали PowerMock и EasyMock, чтобы заглушки / насмешки над классами Menu и MenuItem для Android. Я пытался сделать что-то похожее с PowerMock и Mockito с классом Activity.

Я понимаю, что многие методы являются окончательными и что в Android.jar все они просто генерируют RuntimeException ("Stub!").

Я также понимаю, что этот тест не завершен, но я просто хотел посмотреть, можно ли посмеяться над классом активности Android.

Но, учитывая, что PowerMock позволяет имитировать классы с помощью финальных методов, разве этот код не должен работать?

@RunWith(PowerMockRunner.class)
@PrepareForTest(Activity.class)
public class MyTestCase extends TestCase {

    public void testPlease_JustWork() throws Exception {
        Activity mockActivity = PowerMockito.mock(Activity.class);

        PowerMockito.when(mockActivity.getTitle()).thenReturn("Title");
    }
}

Я бы подумал, что RuntimeException больше не возникнет, и будет возвращено «Title», но оно все равно выдает исключение.

Я пробовал все виды разных вещей, таких как doReturn("Title").when(mockActivity).getTitle(); и suppress(constructor(Activity.class));

Я что-то не так делаю или это просто невозможно?

Ответы [ 3 ]

5 голосов
/ 07 сентября 2011

Возможно, это не прямой ответ на ваш вопрос, но вы можете попробовать Robolectric , чтобы протестировать части вашего приложения для Android на вашем ПК.

Робоэлектрик избегает заглушки! исключение и дает вам минимальная реализация классов Android

2 голосов
/ 17 октября 2011

Я думаю, что ответ в том, что порядок ваших библиотек, на которые ссылаются, имеет значение, потому что android.jar содержит некоторые заглушки для junit.

Вы должны убедиться, что в вашем тестовом проекте, если вы перейдете в «свойства», а затем «путь сборки Java», JAR-файл, связанный с полной версией загруженного Powermock, отобразится на вкладке «Заказ и экспорт» выше android.jar. Если это не так, система разрешает пакеты junit.framework и junit.runner из android.jar, а затем разрешает их из файла junit.jar, включенного в powermock.

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

0 голосов
/ 28 сентября 2010

Я только что попробовал ваш пример кода, и он работает здесь, странно. Я скачал PowerMock 1.4.5 с Mockito и JUnit, включая зависимости, и использовал файл android.jar из sdk (2.2). Сбой только с исключением, если я удалю @ PrepareForTest.

EDIT

Вы можете использовать android.jar с удаленным кодом исключения, приведенным в статье, на которую вы ссылались.

...