Apa's terbaik kerangka kerja untuk menciptakan benda-benda tiruan dalam Jawa? Mengapa? Apa pro dan kontra dari masing-masing framework?
I've telah sukses baik menggunakan Mockito.
Ketika saya mencoba belajar tentang JMock dan EasyMock, saya menemukan kurva belajar untuk menjadi sedikit curam (meskipun mungkin yang's just me).
Saya suka Mockito karena bentuknya yang sederhana dan bersih sintaks yang saya mampu untuk memahami cukup cepat. Minimal sintaks dirancang untuk mendukung kasus umum dengan sangat baik, meskipun beberapa kali saya perlu melakukan sesuatu yang lebih rumit saya menemukan apa yang saya inginkan adalah didukung dan mudah untuk dipahami.
Berikut ini's (ringkasan) contoh dari Mockito homepage:
import static org.mockito.Mockito.*;
List mockedList = mock(List.class);
mockedList.clear();
verify(mockedList).clear();
Itu doesn't mendapatkan jauh lebih sederhana dari itu.
Satu-satunya kelemahan utama yang dapat saya pikirkan adalah bahwa hal itu tidak't tiruan metode statis.
Saya pencipta PowerMock jadi jelas saya harus merekomendasikan bahwa! :-)
PowerMock membentang kedua EasyMock dan Mockito dengan kemampuan untuk mock metode statis, final dan bahkan metode swasta. Yang EasyMock dukungan yang lengkap, tapi Mockito plugin membutuhkan lebih banyak pekerjaan. Kami berencana untuk menambahkan JMock dukungan serta.
PowerMock ini tidak dimaksudkan untuk menggantikan framework lain, melainkan dapat digunakan dalam situasi yang rumit ketika framework lain tidak't memungkinkan mengejek. PowerMock juga berisi fitur berguna lainnya seperti menekan statis penginisialisasi dan konstruktor.
≪a href="http://jmockit.org">JMockit lokasi proyek berisi banyak informasi komparatif untuk saat ini mengejek toolkit.
Secara khusus, check out perbandingan fitur matrix, yang meliputi EasyMock, jMock, Mockito, Unitils Mengejek, PowerMock, dan tentu saja JMockit. Saya mencoba untuk tetap akurat dan up-to-date, sebanyak mungkin.
I've telah mengalami keberhasilan dengan JMockit.
It's cukup baru, dan begitu itu's bit mentah dan didokumentasikan di bawah. Menggunakan ASM untuk secara dinamis mengubah kelas bytecode, sehingga dapat mengejek semua metode termasuk statis, swasta, konstruktor, dan statis penginisialisasi. Misalnya:
import mockit.Mockit;
...
Mockit.redefineMethods(MyClassWithStaticInit.class,
MyReplacementClass.class);
...
class MyReplacementClass {
public void $init() {...} // replace default constructor
public static void $clinit{...} // replace static initializer
public static void myStatic{...} // replace static method
// etc...
}
Ia memiliki Harapan antarmuka yang memungkinkan merekam/pemutaran skenario juga:
import mockit.Expectations;
import org.testng.annotations.Test;
public class ExpecationsTest {
private MyClass obj;
@Test
public void testFoo() {
new Expectations(true) {
MyClass c;
{
obj = c;
invokeReturning(c.getFoo("foo", false), "bas");
}
};
assert "bas".equals(obj.getFoo("foo", false));
Expectations.assertSatisfied();
}
public static class MyClass {
public String getFoo(String str, boolean bool) {
if (bool) {
return "foo";
} else {
return "bar";
}
}
}
}
The downside adalah bahwa hal itu memerlukan Jawa 5/6.
Anda bisa juga melihat pada pengujian menggunakan Groovy. Di Groovy anda dapat dengan mudah mengejek Jawa interface menggunakan 'sebagai' operator:
def request = [isUserInRole: { roleName -> roleName == "testRole"}] as HttpServletRequest
Terlepas dari fungsi dasar ini Groovy menawarkan lebih banyak di mengejek depan, termasuk kuat MockFor
dan StubFor
kelas.
http://docs.codehaus.org/display/GROOVY/Groovy+Mengolok-olok
Saya mulai menggunakan mengolok-olok dengan EasyMock. Cukup mudah untuk memahami, tapi replay langkah agak mengganggu. Mockito menghilangkan ini, juga memiliki cleaner sintaks seperti yang terlihat seperti pembacaan adalah salah satu tujuan utama. Saya tidak bisa cukup menekankan betapa pentingnya hal ini, karena sebagian besar pengembang akan menghabiskan waktu mereka untuk membaca dan memelihara kode yang ada, tidak menciptakan itu.
Lain hal yang baik adalah bahwa antarmuka dan implementasi kelas-kelas yang ditangani dengan cara yang sama, tidak seperti di EasyMock mana masih perlu anda ingat (check) untuk menggunakan EasyMock Kelas Ekstensi.
I've mengambil cepat melihat JMockit baru-baru ini, dan sementara daftar cucian fitur cukup lengkap, saya pikir harga ini adalah keterbacaan yang dihasilkan kode, dan harus menulis lebih lanjut.
Bagi saya, Mockito adalah sweet spot, menjadi mudah untuk menulis dan membaca, dan berurusan dengan sebagian besar situasi yang sebagian besar akan memerlukan kode. Menggunakan Mockito dengan PowerMock akan menjadi pilihan saya.
Satu hal yang perlu dipertimbangkan adalah bahwa alat yang akan anda pilih jika anda mengembangkan sendiri, atau pada sedikit ketat-merajut tim, mungkin tidak menjadi yang terbaik untuk mendapatkan untuk sebuah perusahaan besar dengan pengembang dari berbagai tingkat keterampilan. Keterbacaan, kemudahan penggunaan dan kesederhanaan akan membutuhkan lebih banyak pertimbangan dalam kasus terakhir. Tidak masuk akal dalam mendapatkan ultimate mocking framework jika banyak orang akhirnya tidak menggunakan atau tidak menjaga tes.
Kita sedang gencar menggunakan EasyMock dan EasyMock Kelas Ekstensi di tempat kerja dan cukup senang dengan itu. Hal ini pada dasarnya memberikan anda semua yang anda butuhkan. Lihatlah dokumentasi, ada's contoh yang sangat bagus yang menunjukkan semua fitur dari EasyMock.
Aku digunakan JMock awal. I've mencoba Mockito di proyek terakhir saya dan menyukainya. Lebih ringkas, lebih bersih. PowerMock mencakup semua kebutuhan yang ada di Mockito, seperti mengejek kode statis, mengejek contoh penciptaan, mengejek akhir kelas dan metode. Jadi saya memiliki semua yang saya butuhkan untuk melakukan pekerjaan saya.
Saya suka JMock karena anda dapat mengatur harapan. Ini benar-benar berbeda dari yang memeriksa jika sebuah metode yang disebut ditemukan di beberapa mock perpustakaan. Menggunakan JMock anda dapat menulis sangat canggih harapan. Melihat jmock cheat sheat.
Ya, Mockito adalah kerangka besar. Saya menggunakannya bersama-sama dengan hamcrest dan Google guice untuk setup saya tes.
Solusi terbaik untuk mengejek adalah untuk memiliki mesin melakukan semua pekerjaan dengan otomatis specification-based testing. Untuk Jawa, lihat ScalaCheck dan Reductio kerangka termasuk dalam Fungsional Jawa perpustakaan. Dengan otomatis specification-based testing framework, anda menyediakan sebuah spesifikasi dari metode di bawah test (properti tentang hal yang harus benar) dan kerangka kerja yang menghasilkan tes serta benda-benda tiruan, secara otomatis.
Sebagai contoh, berikut properti tes Matematika.sqrt metode untuk melihat jika akar kuadrat dari setiap angka positif n kuadrat sama dengan n.
val propSqrt = forAll { (n: Int) => (n >= 0) ==> scala.Math.sqrt(n*n) == n }
Ketika anda menelepon propSqrt.check()
, ScalaCheck menghasilkan ratusan bilangan bulat dan cek properti anda masing-masing, secara otomatis juga memastikan bahwa kasus tepi yang tertutup baik.
Meskipun ScalaCheck ditulis dalam Scala, dan membutuhkan Scala Compiler, it's mudah untuk menguji kode Java dengan itu. Yang Reductio dalam kerangka Fungsional Jawa adalah murni Jawa implementasi dari konsep yang sama.
Mockito juga menyediakan pilihan untuk mematikan metode, sesuai dengan argumen (seperti anyInt() dan anyString()), memverifikasi jumlah penyertaan (kali(3), atLeastOnce(), tidak pernah()), banyak.
I've juga menemukan bahwa Mockito adalah sederhana dan clean.
Satu hal yang saya don't seperti tentang Mockito adalah bahwa anda bisa't rintisan metode statis.
Untuk sesuatu yang sedikit berbeda, anda bisa menggunakan JRuby dan Mocha yang digabungkan dalam JtestR untuk menulis tes untuk kode Java di ekspresif dan ringkas Ruby. Ada beberapa berguna mengejek contoh dengan JtestR di sini. Salah satu keuntungan dari pendekatan ini adalah bahwa mengejek beton kelas sangat mudah.