Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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