Sebenarnya, saya perlu mendapat respons dari panggilan API, untuk itu saya memerlukannya Context
.
robolectric
pengguna1667968
sumber
sumber
RuntimeEnvironment.application
kode statis (seperti metode yang dianotasi@BeforeClass
) karena Robolectric mungkin tidak akan diinisialisasi pada saat itu dan nilainya akan seperti itunull
.Kamu bisa memakai
sumber
Gunakan ini:
sumber
Menambahkan
Dan gunakan:
sumber
Untuk Robolectric 4.3 terbaru saat ini di tahun 2019 '
`dan
keduanya dikecualikan. Jadi saya menggunakan
untuk mendapatkan Konteks.
sumber
Untuk mendapatkan konteks aplikasi, Anda harus melakukan hal berikut:
sumber
Ini berfungsi untuk saya dengan Robolectric 3.5.1:
ShadowApplication.getInstance().applicationContext
sumber
RuntimeEnvironment.application
atauRuntimeEnvironment.application.getApplicationContext()
jika itu berhasil untuk Anda.Pada rilis 4.0-alpha-3 pada 21 Juli, mereka dihapus
ShadowApplication.getApplicationContext()
. Tetap gunakanRuntimeEnvironment.application.getApplicationContext()
untuk pengujian apa pun yang dianotasi@RunWith(RobolectricTestRunner::class)
.Selain itu, panduan mereka saat ini memiliki contoh mendapatkan resource string menggunakan:
(Perhatikan bahwa javadocs untuk
RuntimeEnvironment
danShadowApplication
saat ini mencerminkan rilis non-alfa 3.x.)sumber
Pertama tambahkan yang berikut ini ke Anda
build.gradle
:testImplementation 'androidx.test:core:1.2.0'
lalu gunakan:
ApplicationProvider.getApplicationContext() as Application
sumber
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:
Pastikan bahwa direktori Kerja Konfigurasi Run / Debug Anda disetel ke: $ MODULE_DIR $
sumber
Ini lebih aman digunakan
Robolectric.getShadowApplication()
daripada menggunakanRobolectric.application
secara langsung.sumber
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' }
sumber
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 )
sumber
Oke, jadi saya tahu banyak orang lain yang mengatakan jawaban ini sebelumnya dan mungkin sudah ketinggalan zaman
Saya mendapatkan null, karena when () part adalah SETELAH inisialisasi sut. Mungkin membantu beberapa dari Anda.
juga saya punya
di awal kelas
Juga
sumber