Mockito tworzy instancję proxy, gdy coś jest szpiegowane. Czy istnieje jakiś sposób przekazywania zestawów ustawiających, które są następnie wykonywane w tej instancji proxy do rzeczywistej instancji, która znajduje się za nią?Jak poprawnie szpiegować działanie
Uzasadnienie: Mam instancję obiektu, której nie mam pod całkowitą kontrolą, tj. Działanie Androida. Mogę podać większość części mojej aplikacji jako wersję Proxy i działa dobrze tak, jak jest, , ale, ponieważ potrzebuję utworzyć szpiega/proxy bardzo wcześnie podczas fazy tworzenia działania, nie jest jeszcze w pełni utworzona, np. kontekst podstawowy nie jest dołączony. Dzieje się tak na instancji proxy i nie jest oczywiście używane przez samą instancję działania (która odnosi się do siebie poprzez Activity.this
). Rezultatem jest to, że prowadzi to do wszelkiego rodzaju awarii, ponieważ rozdzielanie zasobów odbywa się poprzez ten kontekst bazowy, więc wewnętrzna maszyna Fragmentowa rzuca NPE i więcej.
Oto kod:
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;
}
}
Jestem pojęcia - jakieś pomysły?
Dlaczego nie używacie espresso: https://google.github.io/android-testing-support-library/docs/espresso/ Więc można również kontrolować działalność. –
Używam już Espresso, to nie ma nic wspólnego z moim pytaniem. –
dodaje metodę @VisibleForTesting setDelegate() do aktywności poza pytaniem? Uważam, że każde podejście, które obejmuje wstrzykiwanie szpiegów z Działalności, zawsze będzie miało jakiś skrajny przypadek, w którym nie będzie działać. – jdonmoyer