Właściwie potrzebuję odpowiedzi na wywołanie API, do tego potrzebowałem Context
.
robolectric
user1667968
źródło
źródło
RuntimeEnvironment.application
w kodzie statycznym (jak metody z adnotacjami@BeforeClass
), ponieważ Robolectric prawdopodobnie nie zostanie zainicjowany w tym momencie, a wartość będzienull
.Możesz użyć
źródło
Użyj tego:
źródło
Dodaj
I użyć:
źródło
Najnowsza wersja Robolectric 4.3 od teraz w 2019 r. ''
`i
oboje są pozbawieni praw. Więc używam
aby uzyskać Context.
źródło
Aby uzyskać kontekst aplikacji, wykonaj następujące czynności:
źródło
To działa dla mnie z Robolectric 3.5.1:
ShadowApplication.getInstance().applicationContext
źródło
RuntimeEnvironment.application
lubRuntimeEnvironment.application.getApplicationContext()
jeśli to działa dla Ciebie.Od wydania 4.0-alpha-3 21 lipca zostały one usunięte
ShadowApplication.getApplicationContext()
. Trzymaj sięRuntimeEnvironment.application.getApplicationContext()
wszelkich testów z adnotacją@RunWith(RobolectricTestRunner::class)
.Na marginesie, ich obecny przewodnik zawiera przykład pobierania zasobów ciągów za pomocą:
(Zauważ, że javadocs dla
RuntimeEnvironment
iShadowApplication
obecnie odzwierciedlają wersję inną niż alfa 3.x).źródło
Najpierw dodaj do swojego
build.gradle
:testImplementation 'androidx.test:core:1.2.0'
następnie użyj:
ApplicationProvider.getApplicationContext() as Application
źródło
W niektórych przypadkach może być potrzebny kontekst aplikacji zamiast domyślnego kontekstu Robolectris. Na przykład, jeśli chcesz uzyskać nazwę swojego pakietu. Domyślnie Robolectric zwróci Ci
org.robolectric.default
nazwę pakietu. Aby uzyskać prawdziwą nazwę pakietu, wykonaj następujące czynności:build.gradle
testImplementation 'org.robolectric:robolectric:4.2.1'
Twoja klasa testowa:
Upewnij się, że w katalogu roboczym Run / Debug Configurations ustawiono: $ MODULE_DIR $
źródło
Bezpieczniej jest używać
Robolectric.getShadowApplication()
zamiastRobolectric.application
bezpośrednio.źródło
Robolectric.application
Zgadzam się z odpowiedziami @EugenMartynov i @rds ....
Szybki przykład można znaleźć w Volley-Marshmallow-Release
w NetworkImageViewTest.java
// mNIV = new NetworkImageView(Robolectric.application); mNIV = new NetworkImageView(RuntimeEnvironment.application);
Link do Volleya jest dostępny https://android.googlesource.com/platform/frameworks/volley/+/marshmallow-release
musisz dodać zależności w module volley w Android Studio jako:
dependencies { testCompile 'junit:junit:4.12' testCompile 'org.mockito:mockito-core:1.10.19' testCompile 'org.robolectric:robolectric:3.1.2' }
źródło
W twoim przypadku myślę, że powinieneś uważać na to, co tak naprawdę testujesz. Czasami napotkanie problemów z niesprawdzalnym kodem lub pozornie niesprawnym kodem jest oznaką, że być może twój kod wymaga refaktoryzacji.
W przypadku odpowiedzi na wywołanie interfejsu API możesz nie chcieć testować samego wywołania interfejsu API. Może nie być konieczne testowanie, czy możliwe jest wysyłanie / odbieranie informacji z dowolnej usługi internetowej, ale raczej to, że kod obsługuje i przetwarza odpowiedź w oczekiwany sposób.
W takim przypadku lepiej byłoby zrefaktoryzować kod, który próbujesz przetestować. Podziel analizę / obsługę odpowiedzi na inną klasę, która akceptuje proste
String
i przeprowadź testy na tej klasie , wstrzykując przykładowe odpowiedzi w postaci ciągów.Jest to mniej więcej zgodne z ideami Single Responsibility and Dependency Inversion (The S i D w SOLID )
źródło
Ok, więc wiem, że wielu innych powiedziało tę odpowiedź wcześniej i może już być nieaktualna
Otrzymałem wartość null, ponieważ część when () była PO inicjalizacji sut. To może pomóc niektórym z was.
też mam
na początku zajęć
Również
źródło