Saya menggunakan Spring 3.1.4.RELEASE dan Mockito 1.9.5. Di kelas Musim Semi saya, saya memiliki:
@Value("#{myProps['default.url']}")
private String defaultUrl;
@Value("#{myProps['default.password']}")
private String defaultrPassword;
// ...
Dari pengujian JUnit saya, yang saat ini saya siapkan seperti ini:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath:test-context.xml" })
public class MyTest
{
Saya ingin mengejek nilai untuk bidang "defaultUrl" saya. Perhatikan bahwa saya tidak ingin mengejek nilai untuk bidang lain - Saya ingin mempertahankannya sebagaimana adanya, hanya bidang "defaultUrl". Juga perhatikan bahwa saya tidak memiliki metode "penyetel" yang eksplisit (misalnya setDefaultUrl
) di kelas saya dan saya tidak ingin membuatnya hanya untuk tujuan pengujian.
Mengingat ini, bagaimana saya dapat membuat tiruan nilai untuk satu bidang itu?
ReflectionTestUtils.setField(bean, "fieldName", "value");
sebelum menjalankanbean
metode Anda selama pengujian.Sekarang sudah ketiga kalinya saya googling sendiri ke posting SO ini karena saya selalu lupa cara mengejek bidang @Value. Meskipun jawaban yang diterima benar, saya selalu membutuhkan waktu untuk mendapatkan panggilan "setField" dengan benar, jadi setidaknya untuk diri saya sendiri, saya menempelkan cuplikan contoh di sini:
Kelas produksi:
Kelas tes:
sumber
Anda juga dapat meniru konfigurasi properti Anda ke dalam kelas pengujian Anda
sumber
Saya ingin menyarankan solusi terkait, yaitu meneruskan
@Value
bidang -annotated sebagai parameter ke konstruktor, daripada menggunakanReflectionTestUtils
kelas.Daripada ini:
dan
Melakukan hal ini:
dan
Manfaat dari pendekatan ini: 1) kita dapat membuat instance kelas Foo tanpa wadah ketergantungan (ini hanya konstruktor), dan 2) kita tidak menggabungkan pengujian kita dengan detail implementasi kita (refleksi mengikat kita ke nama bidang menggunakan string, yang dapat menyebabkan masalah jika kita mengubah nama field).
sumber
Anda dapat menggunakan anotasi Tes Musim Semi ajaib ini:
lihat org.springframework.test.context.TestPropertySource
Misalnya, ini adalah kelas tesnya:
Dan ini kelas dengan properti:
sumber
Saya menggunakan kode di bawah ini dan itu berhasil untuk saya:
Referensi: https://www.jeejava.com/mock-an-autowired-value-field-in-spring-with-junit-mockito/
sumber
Salah satu cara untuk mengatasinya adalah dengan mengubah kelas Anda menggunakan Constructor Injection , yang digunakan untuk pengujian dan injeksi Spring. Tidak ada lagi refleksi :)
Jadi, Anda dapat meneruskan String apa pun menggunakan konstruktor:
Dan dalam pengujian Anda, gunakan saja:
sumber