Jadual Kandungan
Analisis Masalah: Perisik Mockito bercanggah dengan Instantiation Langsung
Penyelesaian: Memperkenalkan suntikan ketergantungan
Nota dan ringkasan
Rumah Java javaTutorial Mockito Spy dan Suntikan Ketergantungan: Selesaikan Masalah bahawa kaedah tidak memanggil nilai mengejek dalam ujian

Mockito Spy dan Suntikan Ketergantungan: Selesaikan Masalah bahawa kaedah tidak memanggil nilai mengejek dalam ujian

Aug 04, 2025 pm 08:03 PM

Mockito Spy and Dependency Suntikan: Selesaikan masalah yang kaedah dalam ujian tidak memanggil nilai mengejek

Artikel ini membincangkan masalah biasa apabila menggunakan fungsi pengintip Mockito untuk mensimulasikan kaedah kelas sebahagian, nilai simulasi tidak berkuatkuasa. Alasan teras ialah kod pengeluaran secara langsung meneliti objek yang diuji, yang menyebabkan contoh mata -mata yang dibuat dalam ujian yang akan digunakan. Artikel ini menghuraikan bagaimana menyelesaikan masalah ini melalui suntikan ketergantungan, corak reka bentuk, dan menyediakan contoh kod dan pertimbangan khusus untuk membantu pemaju melakukan ujian unit dengan lebih berkesan.

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

  1. 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.
  2. 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 ().
  3. 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.
  4. 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.
  5. 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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

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

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial PHP
1535
276
Penanda aras prestasi benang maya java Penanda aras prestasi benang maya java Jul 21, 2025 am 03:17 AM

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.

Java Microservices Perkhidmatan Mesh Integrasi Java Microservices Perkhidmatan Mesh Integrasi Jul 21, 2025 am 03:16 AM

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.

Bagaimana menangani transaksi di Java dengan JDBC? Bagaimana menangani transaksi di Java dengan JDBC? Aug 02, 2025 pm 12:29 PM

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.

Menguasai Suntikan Ketergantungan di Jawa dengan Spring dan Guice Menguasai Suntikan Ketergantungan di Jawa dengan Spring dan Guice Aug 01, 2025 am 05:53 AM

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

Membandingkan kerangka Java: Spring Boot vs Quarkus vs Micronaut Membandingkan kerangka Java: Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

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

Membina API Restful di Jawa dengan Jakarta EE Membina API Restful di Jawa dengan Jakarta EE Jul 30, 2025 am 03:05 AM

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

Bagaimana untuk bekerja dengan kalendar di Jawa? Bagaimana untuk bekerja dengan kalendar di Jawa? Aug 02, 2025 am 02:38 AM

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

Pengoptimuman prestasi java dan teknik profil Pengoptimuman prestasi java dan teknik profil Jul 31, 2025 am 03:58 AM

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

See all articles