Saya membaca beberapa utas di sini tentang metode statis, dan saya pikir saya mengerti masalah penyalahgunaan / penggunaan berlebihan metode statis dapat menyebabkan. Tetapi saya tidak benar-benar memahami mengapa sulit untuk mengejek metode statis.
Saya tahu kerangka mengejek lainnya, seperti PowerMock, bisa melakukan itu tetapi mengapa tidak bisa Mockito?
Saya membaca artikel ini , tetapi penulis tampaknya religius menentang kata itu static
, mungkin itu pemahaman saya yang buruk.
Penjelasan / tautan yang mudah akan sangat bagus.
Jawaban:
Saya pikir alasannya mungkin bahwa perpustakaan objek tiruan biasanya membuat tiruan dengan secara dinamis membuat kelas saat runtime (menggunakan cglib ). Ini berarti mereka mengimplementasikan antarmuka saat runtime (itulah yang EasyMock lakukan jika saya tidak salah), atau mereka mewarisi dari kelas untuk mengejek (itulah yang dilakukan Mockito jika saya tidak salah). Kedua pendekatan tidak berfungsi untuk anggota statis, karena Anda tidak dapat menimpanya menggunakan pewarisan.
Satu-satunya cara untuk mengejek statika adalah dengan memodifikasi kode byte kelas pada saat runtime, yang saya kira sedikit lebih terlibat daripada pewarisan.
Itu dugaan saya, untuk apa nilainya ...
sumber
Jika Anda perlu mengejek metode statis, itu adalah indikator kuat untuk desain yang buruk. Biasanya, Anda mengejek ketergantungan ujian kelas Anda. Jika class-under-test Anda merujuk pada metode statis - seperti java.util.Math # sin misalnya - itu berarti kelas-under-test membutuhkan implementasi ini (misalnya akurasi vs kecepatan). Jika Anda ingin abstrak dari implementasi sinus konkret Anda mungkin perlu Interface (Anda melihat di mana ini akan)?
sumber
Saya sungguh-sungguh berpikir bahwa itu adalah kode bau jika Anda perlu mengejek metode statis juga.
Satu-satunya saat ini tampaknya berlebihan bagi saya, adalah libs seperti Guava, tetapi Anda tidak perlu mengejek jenis ini karena itu bagian dari logika ... (hal-hal seperti Iterables.transform (..))
Dengan cara itu kode Anda sendiri tetap bersih, Anda dapat mengejek semua dependensi Anda dengan cara yang bersih, dan Anda memiliki lapisan anti korupsi terhadap dependensi eksternal. Saya telah melihat PowerMock dalam praktiknya dan semua kelas yang kami butuhkan dirancang dengan buruk. Integrasi PowerMock juga terkadang menyebabkan masalah serius
(mis. Https://code.google.com/p/powermock/issues/detail?id=355 )
PS: Sama berlaku untuk metode pribadi juga. Saya tidak berpikir tes harus tahu tentang detail metode pribadi. Jika sebuah kelas sangat kompleks sehingga tergoda untuk mengolok-olok metode pribadi, itu mungkin tanda untuk memecah kelas itu ...
sumber
@Inject SomeDependency
dan dalam konfigurasi saya, saya mendefinisikanbind(SomeDependency.class).in(Singleton.class)
. Jadi jika besok bukan Singleton lagi, saya mengubah satu konfigurasi dan hanya itu.Foo.getInstance()
mana-mana. Saya hanya menulis singleton dalam jawaban untuk melawan argumen "tetapi metode statis tidak memerlukan penciptaan banyak objek pembungkus". Juga secara konsep bagi saya ada sedikit perbedaan antara metode statis dan metode contoh pada singleton, hanya saja Anda tidak dapat mengejek kolaborator singleton ini. Tapi singleton atau bukan sama sekali bukan poin yang saya coba buat, intinya adalah menyuntikkan dan mengejek kolaborator dan tidak memanggil metode statis jika itu membuat pengujian sulit.Mockito mengembalikan objek tetapi statis berarti "level kelas, bukan level objek" Jadi mockito akan memberikan pengecualian pointer nol untuk statis.
sumber
Dalam beberapa kasus, metode statis bisa sulit untuk diuji, terutama jika mereka perlu diejek, itulah sebabnya sebagian besar kerangka kerja mengejek tidak mendukungnya. Saya menemukan posting blog ini sangat berguna dalam menentukan bagaimana cara mengejek metode dan kelas statis.
sumber