Saya memiliki sepotong kode Java yang menggunakan variabel lingkungan dan perilaku kode tergantung pada nilai variabel ini. Saya ingin menguji kode ini dengan nilai yang berbeda dari variabel lingkungan. Bagaimana saya bisa melakukan ini di JUnit?
Saya telah melihat beberapa cara untuk mengatur variabel lingkungan di Jawa secara umum, tetapi saya lebih tertarik pada aspek pengujian unit, terutama mengingat bahwa tes tidak boleh saling mengganggu.
java
unit-testing
testing
junit
environment-variables
riwayat hidup
sumber
sumber
Jawaban:
Pustaka Aturan Sistem memberikan Aturan JUnit untuk mengatur variabel lingkungan.
Penafian: Saya penulis Aturan Sistem.
sumber
import org.junit.contrib.java.lang.system.EnvironmentVariables;
Anda perlu menambahkan ketergantungancom.github.stefanbirkner:system-rules
pada proyek Anda. Ini tersedia di MavenCentral.Solusi yang biasa adalah membuat kelas yang mengelola akses ke variabel lingkungan ini, yang kemudian dapat Anda tiru di kelas tes Anda.
Kelas yang diuji kemudian mendapatkan variabel lingkungan menggunakan kelas Lingkungan, bukan langsung dari System.getenv ().
sumber
Dalam situasi yang sama seperti ini di mana saya harus menulis Test Case yang bergantung pada Variabel Lingkungan , saya mencoba sebagai berikut:
Saya menghabiskan satu hari menggunakan dua pendekatan di atas, tetapi tidak berhasil. Lalu Maven datang untuk menyelamatkanku. Kita dapat mengatur Variabel Lingkungan atau Properti Sistem melalui file POM Maven yang saya pikir cara terbaik untuk melakukan Pengujian Unit untuk proyek berbasis Maven . Di bawah ini adalah entri yang saya buat di file POM .
Setelah perubahan ini, saya menjalankan Uji Kasus lagi dan tiba-tiba semua berfungsi seperti yang diharapkan. Untuk informasi pembaca, saya menjelajahi pendekatan ini dalam Maven 3.x , jadi saya tidak tahu pada Maven 2.x .
sumber
Saya pikir cara terbersih untuk melakukan ini adalah dengan Mockito.spy (). Ini sedikit lebih ringan daripada membuat kelas terpisah untuk mengejek dan membagikannya.
Pindahkan variabel lingkungan Anda ke metode lain:
Sekarang di unit test Anda, lakukan ini:
sumber
Saya rasa ini belum disebutkan, tetapi Anda juga bisa menggunakan Powermockito :
Diberikan:
Anda dapat melakukan hal berikut:
sumber
when(System.getenv("FOO_VAR_1")).thenReturn("test-foo-var-1")
menyebabkanorg.mockito.exceptions.misusing.MissingMethodInvocationException: when() requires an argument which has to be 'a method call on a mock'.
kesalahanPisahkan kode Java dari variabel Lingkungan yang menyediakan pembaca variabel yang lebih abstrak yang Anda sadari dengan EnvironmentVariableReader kode Anda untuk menguji bacaan dari.
Kemudian dalam pengujian Anda, Anda dapat memberikan implementasi yang berbeda dari pembaca variabel yang memberikan nilai tes Anda.
Injeksi ketergantungan dapat membantu dalam hal ini.
sumber
Jawaban untuk pertanyaan ini Bagaimana cara menetapkan variabel lingkungan dari Java? menyediakan cara untuk mengubah (tidak dapat dimodifikasi) Peta di System.getenv (). Jadi sementara itu TIDAK BENAR-BENAR mengubah nilai variabel lingkungan OS, itu dapat digunakan untuk pengujian unit karena tidak mengubah apa System.getenv akan kembali.
sumber
Semoga masalah ini teratasi. Saya hanya berpikir untuk memberi tahu solusi saya.
sumber
Meskipun saya pikir jawaban ini adalah yang terbaik untuk proyek-proyek Maven, itu dapat dicapai melalui refleksi juga (diuji di Jawa 8 ):
sumber
theCaseInsensitiveEnvironment
dan sebaliknya memiliki bidangtheEnvironment
, seperti berikut: `` `envMap = new HashMap <> (); Class <?> Clazz = Class.forName ("java.lang.ProcessEnvironment"); Field theEnvironmentField = clazz.getDeclaredField ("theEnvironment"); Lapangan theUnmodifiableEnvironmentField = clazz.getDeclaredField ("theUnmodifiableEnvironment"); removeStaticFinalAndSetValue (theEnvironmentField, envMap); removeStaticFinalAndSetValue (theUnmodifiableEnvironmentField, envMap); `` `Anda dapat menggunakan metode setup () untuk mendeklarasikan nilai yang berbeda dari env Anda. variabel dalam konstanta. Kemudian gunakan konstanta ini dalam metode pengujian yang digunakan untuk menguji skenario yang berbeda.
sumber
Jika Anda ingin mengambil informasi tentang variabel lingkungan di Jawa, Anda dapat memanggil metode:
System.getenv();
. Sebagai properti, metode ini mengembalikan Peta yang berisi nama variabel sebagai kunci dan nilai variabel sebagai nilai peta. Berikut ini sebuah contoh:Metode
getEnv()
ini juga dapat mengambil argumen. Misalnya :Untuk pengujian, saya akan melakukan sesuatu seperti ini:
sumber
Saya menggunakan System.getEnv () untuk mendapatkan peta dan saya simpan sebagai bidang, sehingga saya bisa mengejeknya:
sumber