


Mockito Spy dan Suntikan Ketergantungan: Selesaikan Masalah bahawa kaedah tidak memanggil nilai mengejek dalam ujian
Analisis Masalah: Perisik Mockito bercanggah dengan Instantiation Langsung
Apabila menggunakan Mockito untuk ujian unit, fungsi pengintip membolehkan kita mensimulasikan sebahagian objek sebenar, iaitu, kita boleh memanggil kaedah sebenar atau kaedah tertentu. Walau bagaimanapun, perangkap yang sama ialah apabila kod pengeluaran (iaitu kaedah yang diuji) secara langsung mewujudkan contoh objek yang bergantung kepada, contoh mata -mata atau mock yang dibuat untuk objek bergantung dalam ujian tidak akan berkuatkuasa.
Pertimbangkan senario berikut:
Coretan kod pengeluaran asal:
kelas awam myservice { CALLULATEPRICE DOUBLEPRICE () { GetOptionBidPrice GetOptionBidPrice = baru GetOptionBidPrice (...); // Masalahnya terletak: secara langsung instantiate double bidPrice = getOptionBidPrice.getBidPrice (); // ... logik perniagaan lain menggunakan bidprice kembali bidprice * 1.1; // Pengiraan sampel} } kelas awam GetOptionBidPrice { // ... pembina dan bidang lain GetBidPrice double public () { // logik perniagaan sebenar, yang mungkin melibatkan permintaan rangkaian atau pengiraan kompleks pulangan 0.0; // Andaikan bahawa pulangan lalai 0 dikembalikan 0.0 } }
Percubaan kod ujian yang sepadan:
import org.junit.jupiter.api.test; import org.mockito.mockito; import statik org.mockito.mockito.doreturn; import statik org.mockito.mockito.spy; import statik org.junit.jupiter.api.assertions.assertequals; kelas awam myservicetest { @Test void testCalculatePriceWithSpy () { // cuba mengintip getOptionbidprice GetOptionBidPrice SpyGetOptionBidPrice = spy (getOptionBidPrice.class); DORETURN (100.0) .When (SpyGetOptionBidPrice) .GetBIBPrice (); // bertumpu kaedah getbidprice // buat contoh myservice dan panggil myservice myservice = myservice baru (); hasil berganda = myservice.calculatePrice (); // Di sini, contoh GetOptionBidPrice baru masih dicipta secara dalaman // hasil yang diharapkan adalah berdasarkan 100.0 tumpukan, tetapi sebenarnya mungkin berdasarkan nilai pulangan sebenar GetOptionBidPrice 0.0 // AssertEquals (110.0, hasil); // mengharapkan nilai} }
Dalam contoh ini, walaupun kami mencipta SpyGetOptionBidPrice dalam ujian dan menumpuk kaedah getBidPrice (), kaedah MyService ClassPrice () secara dalaman mencipta contoh baru GetOptionBidPrice melalui GetOptionBidPrice baru (...). Contoh baru ini sepenuhnya bebas daripada contoh pengintip yang dibuat dalam ujian, jadi kaedah CalculatePrice () memanggil kaedah getBidPrice () contoh sebenar, dan bukannya kaedah yang ditimbun pada contoh mata -mata, mengakibatkan nilai simulasi 100.0 tidak berkuatkuasa, tetapi memperoleh 0.0 yang dikembalikan oleh kaedah sebenar.
Penyelesaian: Memperkenalkan suntikan ketergantungan
Idea utama menyelesaikan masalah di atas bukan untuk membiarkan kelas yang diuji (MyService) secara langsung membuat contoh pergantungannya (GetOptionBidPrice) secara dalaman. Sebaliknya, objek ketergantungan harus "disuntik" ke dalam kelas yang diuji dalam beberapa cara. Corak reka bentuk ini dipanggil suntikan ketergantungan (DI) .
Melalui suntikan pergantungan, kita boleh menyuntik objek ketergantungan sebenar ke dalam kod pengeluaran dan mata -mata atau objek mengejek ke dalam kod ujian untuk mencapai kawalan ke atas tingkah laku ketergantungan.
Kod Pengeluaran Refactored:
kelas awam myservice { Final Private GetOptionBidPrice GetOptionBidPrice; // mengisytiharkan kebergantungan sebagai pemboleh ubah ahli // menyuntik kebergantungan melalui pembina awam myservice (getOptionbidprice getOptionbidPrice) { this.getOptionBidPrice = getOptionBidPrice; } CALLULATEPRICE DOUBLEPRICE () { double bidPrice = getOptionBidPrice.getBidPrice (); // Panggil contoh ketergantungan yang disuntik // ... logik perniagaan lain menggunakan bidprice kembali bidprice * 1.1; } } // Kelas GetOptionBidPrice tetap tidak berubah kelas awam GetOptionBidPrice { // ... pembina dan bidang lain GetBidPrice double public () { pulangan 0.0; } }
Kod Ujian Refactored:
import org.junit.jupiter.api.test; import org.mockito.mockito; import statik org.mockito.mockito.doreturn; import statik org.mockito.mockito.spy; import statik org.junit.jupiter.api.assertions.assertequals; kelas awam myservicetest { @Test void testCalculatePriceWithInjectedSpy () { // cipta dan cerucuk spy instance getOptionbidPrice spygetOptionBidPrice = spy (getOptionBidPrice.class); DORETURN (100.0) .When (SpyGetOptionBidPrice) .GetBIBPrice (); // Inject Spy Instance ke myservice myservice myservice = myservice baru (spygetOptionbidPrice); hasil berganda = myservice.calculatePrice (); // Sekarang, CaltulatePrice akan memanggil kaedah getBidPrice () dari contoh -contoh yang disuntikkan sebagai AssertEquals (110.0, hasil, "hasil pengiraan harus berdasarkan bidprice bertumpuk"); // Sahkan sama ada kaedah getBidPrice dipanggil mockito.verify (spyGetOptionBidPrice) .getBidPrice (); } // Cara Menggunakan Myservice dalam Kod Pengeluaran public static void main (string [] args) { // Dalam persekitaran pengeluaran, suntikan contoh sebenar getOptionbidPrice getOptionBidPrice RealGetOptionBidPrice = getOptionBidPrice baru (/* parameter sebenar*/); MyService RealMyService = Myservice baru (RealGetOptionBidPrice); Double ProductionResult = RealMyService.CalCulatePrice (); System.out.println ("Hasil Pengiraan Persekitaran Pengeluaran:" ProductionResult); } }
Melalui suntikan pembina (salah satu cara suntikan ketergantungan yang paling biasa), MyService tidak lagi bertanggungjawab untuk membuat contoh GetOptionBidPrice, tetapi disediakan secara luaran. Dalam ujian, kami menyediakan contoh mata -mata; Dalam persekitaran pengeluaran, kami menyediakan contoh yang nyata. Dengan cara ini, ujian itu dapat mengawal kelakuan getOptionbidprice yang bergantung kepada MyService.
Nota dan ringkasan
- Kepentingan suntikan ketergantungan: Suntikan ketergantungan bukan sahaja menyelesaikan masalah simulasi dalam ujian, tetapi juga merupakan prinsip teras dalam reka bentuk perisian moden. Ia meningkatkan modulariti, kesesuaian, kebolehpercayaan dan skalabiliti kod. Apabila kelas perlu bergantung pada kelas lain, lebih suka menyuntik kebergantungan ini melalui pembina, kaedah setter, atau antara muka dan bukannya secara langsung membuatnya di dalam kelas.
- Pemilihan pengintip dan mengejek:
- Mock: Ia biasanya digunakan untuk mensimulasikan sepenuhnya antara muka atau kelas. Semua kaedah sistem tidak melakukan logik sebenar secara lalai dan perlu ditumpuk secara eksplisit. Sesuai untuk senario di mana unit ujian sepenuhnya diasingkan dari luar.
- SPY: Digunakan untuk mensimulasikan sebahagian objek sebenar, dan kaedah yang tidak terkawal akan melakukan logik sebenar. Sesuai untuk senario di mana kebanyakan fungsi objek sebenar perlu diuji dan hanya mengawal beberapa kaedah yang sukar untuk diuji atau memakan masa.
- Adalah sesuai untuk menggunakan pengintip dalam kes ini kerana kami mahu kebanyakan tingkah laku GetOptionBidPrice untuk kekal tidak berubah dan hanya menumpuk kaedah GetBidPrice ().
- Granularity ujian: Ujian unit harus memberi tumpuan kepada tingkah laku unit tunggal (biasanya kelas atau kaedah) dan mengasingkan kebergantungannya. Dengan mengejek atau mengintip kebergantungan, kita dapat memastikan fokus ujian terhad kepada unit yang diuji sendiri, mengelakkan faktor luaran yang mengganggu keputusan ujian.
- Elakkan mewujudkan kebergantungan di dalam kaedah yang diuji: ini adalah anti-corak biasa yang menjadikan ujian unit sukar. Sekiranya kaedah mewujudkan kebergantungan yang kompleks secara dalaman, kaedah ini sukar untuk diuji secara berasingan kerana ia ditambah dengan ketergantungan yang dibuatnya.
- Tingkah laku pengesahan: Selepas menggunakan mata -mata atau mengejek, selain mengesahkan nilai pulangan, mockito.verify () juga harus digunakan untuk mengesahkan sama ada kaedah pada objek mengejek dipanggil dengan betul, dan sama ada bilangan panggilan dan parameter seperti yang diharapkan.
Dengan mengamalkan corak suntikan pergantungan dan memahami bagaimana kerja -kerja Mockito Spy, pemaju boleh membina lebih mantap dan mudah untuk menguji aplikasi.
Atas ialah kandungan terperinci Mockito Spy dan Suntikan Ketergantungan: Selesaikan Masalah bahawa kaedah tidak memanggil nilai mengejek dalam ujian. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Benang maya mempunyai kelebihan prestasi yang signifikan dalam senario yang sangat konkurensi dan intensif, tetapi perhatian harus dibayar kepada kaedah ujian dan senario yang berkenaan. 1. Ujian yang betul harus mensimulasikan perniagaan sebenar, terutamanya senario menyekat IO, dan menggunakan alat seperti JMH atau Gatling untuk membandingkan benang platform; 2. Jurang throughput adalah jelas, dan boleh beberapa kali hingga sepuluh kali lebih tinggi daripada 100,000 permintaan serentak, kerana ia lebih ringan dan cekap dalam penjadualan; 3. Semasa ujian, adalah perlu untuk mengelakkan membabi buta mengejar nombor konvensional yang tinggi, menyesuaikan diri dengan model IO yang tidak menyekat, dan memberi perhatian kepada petunjuk pemantauan seperti latensi dan GC; 4.

ServiceMesh adalah pilihan yang tidak dapat dielakkan untuk evolusi seni bina microservice Java, dan terasnya terletak pada decoupling logik rangkaian dan kod perniagaan. 1. ServiceMesh mengendalikan pengimbangan beban, fius, pemantauan dan fungsi lain melalui agen sidecar untuk memberi tumpuan kepada perniagaan; 2. INTOR ISTIO sesuai untuk projek sederhana dan besar, dan Linkerd lebih ringan dan sesuai untuk ujian berskala kecil; 3. Java microservices harus menutup, reben dan komponen lain dan menyerahkannya kepada Istiod untuk penemuan dan komunikasi; 4. Memastikan suntikan automatik sidecar semasa penempatan, perhatikan konfigurasi peraturan lalu lintas, keserasian protokol, dan pembinaan sistem penjejakan log, dan mengamalkan penghijrahan tambahan dan perancangan pemantauan pra-kawalan.

Untuk mengendalikan transaksi JDBC dengan betul, anda mesti terlebih dahulu mematikan mod komit automatik, kemudian melakukan pelbagai operasi, dan akhirnya melakukan atau mengembalikan semula hasilnya; 1. Panggil Conn.SetAutOcommit (palsu) untuk memulakan transaksi; 2. Melaksanakan pelbagai operasi SQL, seperti memasukkan dan mengemaskini; 3. Panggil Conn.Commit () jika semua operasi berjaya, dan hubungi conn.rollback () jika pengecualian berlaku untuk memastikan konsistensi data; Pada masa yang sama, cuba-dengan-sumber harus digunakan untuk menguruskan sumber, mengendalikan pengecualian dengan betul dan menutup sambungan untuk mengelakkan kebocoran sambungan; Di samping itu, adalah disyorkan untuk menggunakan kolam sambungan dan menetapkan mata simpan untuk mencapai rollback separa, dan menyimpan urus niaga sesingkat mungkin untuk meningkatkan prestasi.

DependencyInjection (DI) isadesignpatternwhereBjectsReceivedependencys ke luar, promotingloosecouplingandeasieSierTestthroughconstructor, setter, orfieldInjection.2.springframeworkusesannotationsike@component,@service, dan@autowwithjava yang berasaskan@autowwithjava

Pra-formancetartuptimemoryusage, quarkusandmicronautleadduetocompile-timeprocessingandgraalvsupport, withquarkusoftenperforminglightbetterine serverless scenarios.tyvelopecosyste,

SetupaMaven/gradleprojectwithjax-rsdependencyiSejersey; 2.createarescresourceUsingAnnotationssuchas@pathand@get; 3.configuretheapplicationviaapplicationsubclassorweb.xml;

Gunakan kelas dalam pakej Java.Time untuk menggantikan kelas lama dan kelas kalendar; 2. Dapatkan tarikh dan masa semasa melalui LocalDate, LocalDateTime dan Tempatan Tempatan; 3. Buat tarikh dan masa tertentu menggunakan kaedah (); 4. Gunakan kaedah tambah/tolak untuk meningkatkan dan mengurangkan masa; 5. Gunakan zoneddatetime dan zonid untuk memproses zon waktu; 6. Format dan parse date string melalui DateTimeFormatter; 7. Gunakan segera untuk bersesuaian dengan jenis tarikh lama apabila perlu; pemprosesan tarikh di java moden harus memberi keutamaan untuk menggunakan java.timeapi, yang memberikan jelas, tidak berubah dan linear

Gunakan alat analisis prestasi untuk mencari kesesakan, gunakan VisualVM atau JProfiler dalam peringkat pembangunan dan ujian, dan memberi keutamaan kepada async-profiler dalam persekitaran pengeluaran; 2. Mengurangkan penciptaan objek, menggunakan semula objek, gunakan StringBuilder untuk menggantikan splicing rentetan, dan pilih strategi GC yang sesuai; 3. Mengoptimumkan penggunaan koleksi, pilih dan preset kapasiti awal mengikut tempat kejadian; 4. Mengoptimumkan keserasian, gunakan koleksi serentak, mengurangkan granulariti kunci, dan tetapkan kolam benang dengan munasabah; 5. Tune Parameter JVM, tetapkan saiz timbunan yang munasabah dan pemungut sampah rendah dan membolehkan log GC; 6. Elakkan refleksi di peringkat kod, ganti kelas pembalut dengan jenis asas, penangguhan permulaan, dan gunakan akhir dan statik; 7. Ujian dan Pemantauan Prestasi Berterusan, digabungkan dengan JMH
