Intereting Posts
Можно ли инициализировать Firebase без использования google-services.json? FragmentPagerAdapter getItem неправильное положение Как отправить представление назад? Как управлять программным обеспечением z-заказа? Когда я эмулирую приложение Ionic, он бросает TypeError: невозможно вызвать метод на неопределенный Android: ошибка libGL.so: невозможно открыть файл общих объектов: нет такого файла или каталога Почему onAttach вызывается перед onCreate? ActivityUnitTestCase и startActivity Ресурс для загрузки приложений Android / стилей? Использование ArrayAdapter с AlertDialog и .setAdapter Попытка масштабировать Bitmap на Android не работает Как изменить размер изображений на Android? Камера Android – сохранение изображения в новую папку на SD-карте ActionBarSherlock + ViewPager кэширование больше, чем просто prev / next view Общение между фрагментом и деятельностью – лучшие практики Правильный способ совместного использования изображения (с использованием намерений)

Попытка заглушить андроид Класс активности с использованием PowerMockito throws RuntimeException «Stub!»

Я нашел этот пример, когда они использовали 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 больше не будет выполняться, и «Заголовок» будет возвращен, но он по-прежнему вызывает исключение.

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

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

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

РЕДАКТИРОВАТЬ

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

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

Roboelectric избегает Stub! Исключение и дает вам минимальную реализацию классов Android

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

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

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