Как правильно отслеживать активность

Mockito создает экземпляр прокси, когда что-то проверяется. Теперь, есть ли способ перенаправить сеттеры, которые затем исполняются на этом экземпляре прокси, на реальный экземпляр, который стоит за ним?

Обоснование: у меня есть экземпляр объекта, который у меня не полностью под моим контролем, т. Е. Активность Android. Я могу предоставить большинство частей моего приложения проксированную версию, и это работает нормально, как есть, но поскольку мне нужно создать spy / proxy очень рано на этапе создания этой операции, он еще не полностью создан, например, базовый контекст Не прилагается. Это происходит на экземпляре прокси и, конечно, не используется самим экземпляром активности (который относится к нему через Activity.this ). Конечным результатом является то, что это приводит ко всем видам сбоев, потому что разрешение ресурсов происходит через этот базовый контекст, поэтому внутреннее устройство фрагментации бросает NPE и многое другое.

Вот какой код:

 public class CustomAndroidJUnitRunner extends AndroidJUnitRunner { @Override public Activity newActivity(ClassLoader cl, String className, Intent intent) throws InstantiationException, IllegalAccessException, ClassNotFoundException { Activity activity = super.newActivity(cl, className, intent); return maybeStubSomeDelegate(activity); } private Activity maybeStubSomeDelegate(Activity activity) { if (!(activity instanceof SomeDelegate)) { return activity; } Activity spiedActivity = spy(activity); doReturn(SomeDelegateMock.getInstance()) .when((SomeDelegate) spiedActivity) .getDelegate(); return spiedActivity; } } 

Я не знаю, какие идеи?

Вы можете использовать Robolectric для создания своего собственного прокси (или как Robolectric называет их «Тени») для вашей активности,

Когда вы создаете прокси-сервер, вы можете создавать свои собственные сеттеры, которые могут инициировать методы реальных объектов,

Как создать теневой пример:

 @Implements(Bitmap.class) public class MyShadowBitmap { @RealObject private Bitmap realBitmap; private int bitmapQuality = -1; @Implementation public boolean compress(Bitmap.CompressFormat format, int quality, OutputStream stream) { bitmapQuality = quality; return realBitmap.compress(format, quality, stream); } public int getQuality() { return bitmapQuality; } } } 

Когда @RealObject является вашим реальным экземпляром,

Чтобы использовать эту тень, используя тест-драйв Robolectric, определите новый класс тестов следующим образом:

 @RunWith(RobolectricTestRunner.class) @Config(shadows = MyShadowBitmap.class) public class MyTestClass {} 

Чтобы вытащить текущий теневой экземпляр, используйте метод:

 shadowOf() 

И в любом случае, вот ссылка на Robolectric:

http://robolectric.org/custom-shadows/

Intereting Posts
Пакета R не существует Android edittext – выберите номер телефона контакта (с автозавершением) Ошибка сегментации эмулятора Android Android MediaPlayer – как играть в STREAM_ALARM? Android NullPointerException – параметр Spinner onItemSelected `view` равен null после поворота Почему я получаю «libcore.io.ErrnoException: open failed: ENOENT» при запуске приложения MIO IOIO? Разбор идентификатора строки с SugarORM и GSON Позиция прокрутки переходит к предыдущим элементам списка при прокрутке в пользовательском представлении списка Android. Сохранить состояние экземпляра для диалогов? Панель действий и блок навигации – панель действий с активностью / фрагментом Есть ли способ перегрузить JSONArray, чтобы вести себя как обычный список в цикле? Как использовать unordered_map в Android? Диалог не показывает положительную и отрицательную кнопку Как нарисовать границу в верхней части линейного макета Требуется ли NDK для хорошей производительности при разработке Android-игры?