Sebenarnya, saya perlu mendapat respons dari panggilan API, untuk itu saya memerlukannya Context
.
Sebenarnya, saya perlu mendapat respons dari panggilan API, untuk itu saya memerlukannya Context
.
Jawaban:
Memperbarui.
Cukup gunakan untuk versi 1.x dan 2.x:
Robolectric.application;
Dan untuk versi 3.x:
RuntimeEnvironment.application;
Dan untuk versi 4.x:
tambahkan ke build.gradle
file Anda :
testImplementation 'androidx.test:core:1.0.0'
ambil konteksnya dengan:
ApplicationProvider.getApplicationContext()
RuntimeEnvironment.application
kode statis (seperti metode yang dianotasi @BeforeClass
) karena Robolectric mungkin tidak akan diinisialisasi pada saat itu dan nilainya akan seperti itu null
.
Menambahkan
testImplementation "androidx.test:core-ktx:${deps.testrunner}"
Dan gunakan:
private val app = ApplicationProvider.getApplicationContext()
Untuk Robolectric 4.3 terbaru saat ini di tahun 2019 '
ShadowApplication.getInstance ()
`dan
Roboletric.application
keduanya dikecualikan. Jadi saya menggunakan
Context context = RuntimeEnvironment.systemContext;
untuk mendapatkan Konteks.
Untuk mendapatkan konteks aplikasi, Anda harus melakukan hal berikut:
Ini berfungsi untuk saya dengan Robolectric 3.5.1: ShadowApplication.getInstance().applicationContext
RuntimeEnvironment.application
atau RuntimeEnvironment.application.getApplicationContext()
jika itu berhasil untuk Anda.
Pada rilis 4.0-alpha-3 pada 21 Juli, mereka dihapus ShadowApplication.getApplicationContext()
. Tetap gunakan RuntimeEnvironment.application.getApplicationContext()
untuk pengujian apa pun yang dianotasi @RunWith(RobolectricTestRunner::class)
.
Selain itu, panduan mereka saat ini memiliki contoh mendapatkan resource string menggunakan:
final Context context = RuntimeEnvironment.application;
(Perhatikan bahwa javadocs untuk RuntimeEnvironment
dan ShadowApplication
saat ini mencerminkan rilis non-alfa 3.x.)
Dalam beberapa kasus, Anda mungkin memerlukan konteks aplikasi Anda, bukan konteks default Robolectris. Misalnya, jika Anda ingin mendapatkan nama paket Anda. Secara default, Robolectric akan mengembalikan org.robolectric.default
nama paket Anda . Untuk mendapatkan nama paket asli Anda, lakukan hal berikut:
build.gradle
testImplementation 'org.robolectric:robolectric:4.2.1'
Kelas tes Anda:
@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());
}
}
Pastikan bahwa direktori Kerja Konfigurasi Run / Debug Anda disetel ke: $ MODULE_DIR $
Ini lebih aman digunakan Robolectric.getShadowApplication()
daripada menggunakan Robolectric.application
secara langsung.
Robolectric.application
Setuju dengan jawaban @EugenMartynov dan @rds ....
Contoh cepat dapat ditemukan di Volley-Marshmallow-Release
di NetworkImageViewTest.java
// mNIV = new NetworkImageView(Robolectric.application);
mNIV = new NetworkImageView(RuntimeEnvironment.application);
Tautan Volley tersedia https://android.googlesource.com/platform/frameworks/volley/+/marshmallow-release
Anda harus menambahkan dependensi dalam modul volley di android studio sebagai:
dependencies {
testCompile 'junit:junit:4.12'
testCompile 'org.mockito:mockito-core:1.10.19'
testCompile 'org.robolectric:robolectric:3.1.2'
}
Dalam kasus Anda, saya pikir Anda harus memperhatikan apa yang sebenarnya Anda uji. Kadang-kadang berlari ke masalah diuji kode atau kode yang tampaknya diuji adalah tanda bahwa mungkin kode Anda perlu refactored.
Untuk respons panggilan API, Anda mungkin tidak ingin menguji panggilan API itu sendiri. Mungkin tidak perlu untuk menguji apakah mungkin untuk mengirim / menerima informasi dari sembarang layanan web, tetapi kode Anda menangani dan memproses respons Anda dalam cara yang diharapkan.
Dalam hal ini mungkin lebih baik untuk memfaktor ulang kode yang Anda coba uji. Keluarkan respons parsing / penanganan ke kelas lain yang menerima sederhana String
dan lakukan pengujian Anda pada kelas itu dengan memasukkan respons string sampel.
Ini kurang lebih mengikuti gagasan Single Responsibility and Dependency Inversion (The S dan D in SOLID )
Oke, jadi saya tahu banyak orang lain yang mengatakan jawaban ini sebelumnya dan mungkin sudah ketinggalan zaman
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);
Saya mendapatkan null, karena when () part adalah SETELAH inisialisasi sut. Mungkin membantu beberapa dari Anda.
juga saya punya
@RunWith(CustomRobolectricTestRunner.class)
@Config(constants = BuildConfig.class)
di awal kelas
Juga
when(mockApplication.getApplicationContext()).thenReturn(RuntimeEnvironment.application.getApplicationContext()); works