Właściwie potrzebuję odpowiedzi na wywołanie API, do tego potrzebowałem Context
.
Właściwie potrzebuję odpowiedzi na wywołanie API, do tego potrzebowałem Context
.
Odpowiedzi:
Aktualizacja.
Po prostu użyj dla wersji 1.xi 2.x:
Robolectric.application;
A dla wersji 3.x:
RuntimeEnvironment.application;
A dla wersji 4.x:
dodaj do swojego build.gradle
pliku:
testImplementation 'androidx.test:core:1.0.0'
pobierz kontekst za pomocą:
ApplicationProvider.getApplicationContext()
RuntimeEnvironment.application
w kodzie statycznym (jak metody z adnotacjami @BeforeClass
), ponieważ Robolectric prawdopodobnie nie zostanie zainicjowany w tym momencie, a wartość będzie null
.
Dodaj
testImplementation "androidx.test:core-ktx:${deps.testrunner}"
I użyć:
private val app = ApplicationProvider.getApplicationContext()
Aby uzyskać kontekst aplikacji, wykonaj następujące czynności:
To działa dla mnie z Robolectric 3.5.1: ShadowApplication.getInstance().applicationContext
RuntimeEnvironment.application
lub RuntimeEnvironment.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ą:
final Context context = RuntimeEnvironment.application;
(Zauważ, że javadocs dla RuntimeEnvironment
i ShadowApplication
obecnie odzwierciedlają wersję inną niż alfa 3.x).
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:
@RunWith(RobolectricTestRunner.class)
@Config( manifest="AndroidManifest.xml")
public class FooTest {
@Test
public void fooTestWithPackageName(){
Context context = ApplicationProvider.getApplicationContext();
System.out.println("My Real Package Name: " + context.getPackageName());
}
}
Upewnij się, że w katalogu roboczym Run / Debug Configurations ustawiono: $ MODULE_DIR $
Bezpieczniej jest używać Robolectric.getShadowApplication()
zamiast Robolectric.application
bezpośrednio.
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'
}
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 )
Ok, więc wiem, że wielu innych powiedziało tę odpowiedź wcześniej i może już być nieaktualna
when(mockApplication.getApplicationContext()).thenReturn(RuntimeEnvironment.application);
when(mockApplication.getFilesDir()).thenReturn(RuntimeEnvironment.application.getFilesDir());
sharedPref = RuntimeEnvironment.application.getSharedPreferences(KEY_MY_PREF, Context.MODE_PRIVATE);
sut = new BundleManagerImpl(mockApplication,
processHtmlBundle, resultListener, sharedPref);
Otrzymałem wartość null, ponieważ część when () była PO inicjalizacji sut. To może pomóc niektórym z was.
też mam
@RunWith(CustomRobolectricTestRunner.class)
@Config(constants = BuildConfig.class)
na początku zajęć
Również
when(mockApplication.getApplicationContext()).thenReturn(RuntimeEnvironment.application.getApplicationContext()); works