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

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; } } 

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

Solutions Collecting From Web of "Как правильно отслеживать активность"

Вы можете использовать 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/