Saya baru mengenal Mockito.
Dengan kelas di bawah ini, bagaimana saya bisa menggunakan Mockito untuk memverifikasi yang someMethod
dipanggil tepat satu kali setelah foo
dipanggil?
public class Foo
{
public void foo(){
Bar bar = new Bar();
bar.someMethod();
}
}
Saya ingin melakukan panggilan verifikasi berikut,
verify(bar, times(1)).someMethod();
di mana bar
contoh mengejek Bar
.
Jawaban:
Injeksi Ketergantungan
Jika Anda menyuntikkan turunan Bar, atau pabrik yang digunakan untuk membuat turunan Bar (atau salah satu dari 483 cara lain untuk melakukan ini), Anda akan memiliki akses yang diperlukan untuk melakukan pengujian.
Contoh Pabrik:
Diberi kelas Foo yang ditulis seperti ini:
dalam metode pengujian Anda, Anda dapat menyuntikkan BarFactory seperti ini:
Bonus: Ini adalah contoh bagaimana TDD dapat mendorong desain kode Anda.
sumber
Bar bar = mock(Bar.class)
bukannyaBar bar = new Bar();
BarFactory myFactory = mock(BarFactory.class); when(myFactory.createBar()).thenReturn(bar);
Respons klasiknya adalah, "Kamu tidak." Anda menguji API publik
Foo
, bukan internal.Adakah perilaku
Foo
objek (atau, kurang bagus, beberapa objek lain di lingkungan) yang dipengaruhi olehfoo()
? Jika demikian, ujilah itu. Dan jika tidak, apa yang dilakukan metode ini?sumber
Foo
adalahpublic void foo()
, di mana internal hanya terkait bar.verify()
menjadi sangat membantu memang, bahkan jika Anda tidak lagi beribadah di altar suci pengujian integrasi.Jika Anda tidak ingin menggunakan DI atau Pabrik. Anda dapat memperbaiki kelas Anda dengan cara yang agak rumit:
Dan kelas ujian Anda:
Maka kelas yang memanggil metode foo Anda akan melakukannya seperti ini:
Seperti yang Anda lihat ketika memanggil metode dengan cara ini, Anda tidak perlu mengimpor kelas Bar di kelas lain yang memanggil metode foo Anda yang mungkin merupakan sesuatu yang Anda inginkan.
Tentu saja downside adalah bahwa Anda mengizinkan penelepon untuk mengatur Objek Bar.
Semoga ini bisa membantu.
sumber
Solusi untuk kode contoh Anda menggunakan
PowerMockito.whenNew
FooTest.java
Output JUnit
sumber
Saya pikir Mockito
@InjectMocks
adalah cara untuk pergi.Bergantung pada niat Anda, Anda dapat menggunakan:
Info lebih lanjut dalam dokumen
Di bawah ini adalah contoh dengan injeksi lapangan:
Kelas:
Uji:
sumber
Ya, jika Anda benar-benar ingin / perlu melakukannya, Anda dapat menggunakan PowerMock. Ini harus dianggap sebagai upaya terakhir. Dengan PowerMock, Anda dapat membuatnya mengejek dari panggilan ke konstruktor. Kemudian lakukan verifikasi pada mock. Yang mengatakan, jawaban csturtz adalah "benar".
Berikut adalah tautan ke Mock konstruksi objek baru
sumber
Cara sederhana lainnya adalah menambahkan beberapa pernyataan log ke bar.someMethod () dan kemudian memastikan Anda dapat melihat pesan tersebut ketika tes Anda dieksekusi, lihat contoh di sini: Cara melakukan JUnit menegaskan pesan di logger
Itu sangat berguna ketika Bar.someMethod () Anda
private
.sumber