Unit Test Junit4 Mock Slf4j Logger Atau Log4j Guna Powermockito



Sekarang Tedi cuba menulis beberapa unit test untuk kod-kod legasi dengan pilihan tiada pilihan untuk menukar kod tersebut kepada kod mesra unit test.
Salah satu kes apabila menulis unit test untuk kod macam ini ialah nak cover bahagian yang ada log siap ada condition lak tu pada logger tersebut! Terpaksalah Tedi mock logger tersebut di mana bukan mudah nak menjayakannya.
Ralat 1: Cannot subclass final classRalat 2: Unable to set internal state on a private fieldRalat 1: Cannot subclass final classKesimpulannya menurut pemahaman Tedi lah kan ada masalah untuk subclass final class tapi punca sebenarnya tu mungkin disebabkan oleh beberapa level class dalam kod kita. Contohnya macam di bawah nanti Tedi nak mock LoggerFactory tapi ada masalah pada Log4jLoggerAdapter.
Mesej ralat:
java.lang.IllegalArgumentException: Cannot subclass final class class org.slf4j.impl.Log4jLoggerAdapter
at org.mockito.cglib.proxy.Enhancer.generateClass(Enhancer.java:447)
at org.mockito.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
at org.mockito.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:217)
at org.mockito.cglib.proxy.Enhancer.createHelper(Enhancer.java:378)
at org.mockito.cglib.proxy.Enhancer.createClass(Enhancer.java:318)
at org.powermock.api.mockito.repackaged.ClassImposterizer.createProxyClass(ClassImposterizer.java:123)
at org.powermock.api.mockito.repackaged.ClassImposterizer.imposterise(ClassImposterizer.java:57)
at org.powermock.api.mockito.internal.mockcreation.MockCreator.createMethodInvocationControl(MockCreator.java:111)
at org.powermock.api.mockito.internal.mockcreation.MockCreator.mock(MockCreator.java:59)
at org.powermock.api.mockito.PowerMockito.spy(PowerMockito.java:220)
Tambah semua annotation ni pada kelas test anda (SLf4J):
@RunWith(PowerMockRunner.class)
@PrepareForTest({LoggerFactory.class, Log4jLoggerAdapter.class})
Kalau guna log4j:
@RunWith(PowerMockRunner.class)
@PrepareForTest({Logger.class})
dan baris kod untuk spy digantikan dengan : loggerSpy = PowerMockito.spy( Logger.getLogger(actionToTest.getClass())); 
Contoh kod unit test dalam dunia sebenar:
*** kod ini adalah cuba jaya namun berjalan setakat ni cuma tak bersih lah contohnya Tedi baru tahu bahawa loggerSpy tu tak perlu mock, cukup declare sebagai private variable sahaja.
package com.xxx.txn.core.action.validate;
import com.xxx.db.model.KodBalasan;
import com.xxx.txn.core.Permintaan;
import com.xxx.txn.core.Balasan;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.slf4j.Logger;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.reflect.Whitebox;
import org.slf4j.LoggerFactory;
import org.slf4j.impl.Log4jLoggerAdapter;
import java.util.HashMap;
import java.util.Map;
import static org.powermock.api.mockito.PowerMockito.when;
@RunWith(PowerMockRunner.class)
@PrepareForTest({LoggerFactory.class, Log4jLoggerAdapter.class})
public class ValidatePrepaidAccountExistenceForAccountingActionTest {
private NamaKelasDiuji actionToTest;
@Mock
private Logger loggerSpy;
@Before
public void setUp() {
actionToTest = new NamaKelasDiuji();
loggerSpy = PowerMockito.spy( LoggerFactory.getLogger(actionToTest.getClass()));
}

@Test
public void namaUjian() throws Exception {
// Setup
final Balasan balasan = new Balasan();
final Map<String, Object> serviceMap = new HashMap<>();
Permintaan permintaan = new Permintaan();
balasan.setBalasan(permintaan);
// Prepare mock
when(loggerSpy.isDebugEnabled()).thenReturn(true);
Whitebox.setInternalState(actionToTest.getClass(),"logger", loggerSpy);
// Run the test
actionToTest.process(balasan, serviceMap);
// Verify the results
Assert.assertEquals("Should return INVALID_USER_ID",
KodBalasan.INVALID_USER_ID,balasan.getKodBalasan());
}
}
Ralat 2: Unable to set internal state on a private fieldjava.lang.RuntimeException: Unable to set internal state on a private field. Please report to mockito mailing list.
at org.mockito.internal.util.reflection.Whitebox.setInternalState(Whitebox.java:29)
....
Caused by: java.lang.RuntimeException: You want me to get this field: 'logger' on this class: 'Object' but this field is not declared withing hierarchy of this class!
at org.mockito.internal.util.reflection.Whitebox.getFieldFromHierarchy(Whitebox.java:40)
at org.mockito.internal.util.reflection.Whitebox.setInternalState(Whitebox.java:25)
PENYELESAIAN:
Import Whitebox daripada PowerMockito bukannya daripada Mockito! Sebab dalam kes ni nak gunakan PowerMock!
//import org.mockito.internal.util.reflection.Whitebox;
import org.powermock.reflect.Whitebox;


Artikel ini hanyalah simpanan cache dari url asal penulis yang berkebarangkalian sudah terlalu lama atau sudah dibuang :

http://www.interpretzz.com/2019/02/unit-test-junit4-mock-slf4j-logger-atau.html

Kempen Promosi dan Iklan
Kami memerlukan jasa baik anda untuk menyokong kempen pengiklanan dalam website kami. Serba sedikit anda telah membantu kami untuk mengekalkan servis percuma aggregating ini kepada semua.

Anda juga boleh memberikan sumbangan anda kepada kami dengan menghubungi kami di sini
Mudahnya Buat Kue Teow Hanya Guna Dua Jenis Tepung

Mudahnya Buat Kue Teow Hanya Guna Dua Jenis Tepung

papar berkaitan - pada 1/8/2022 - jumlah : 212 hits
Pasti ramai menyukai kue teow goreng atau yang berkuah Kalau begitu eloklah buat sendiri lebih terjamin kebersihannya Dikongsikan resipi membuatnya Tip semasa memotong kue teow ni kalau pisau anda pendek bolehlah lipat dua lempeng kue teow ...
Tak Payah Membazir Beli Pewangi Kereta Kos Lagi Jimat Guna Bahan Ni Terlebih Wangi

Tak Payah Membazir Beli Pewangi Kereta Kos Lagi Jimat Guna Bahan Ni Terlebih Wangi

papar berkaitan - pada 1/8/2022 - jumlah : 259 hits
Tak dinafikan kos membeli pewangi kereta yang semakin mahal membuatkan kita berfikir dua kali untuk membeli Tak perlu membazir apa kata gunakan cara mudah ini untuk wangikan seluruh ruang kereta anda Paling penting teramatlah jimat Bukan sa...
Tips Muka Glowing Guna Produk Ini Sahaja

Tips Muka Glowing Guna Produk Ini Sahaja

papar berkaitan - pada 1/8/2022 - jumlah : 442 hits
Tips Muka Glowing Siapa tak nak muka glowing kan Kulit licin dan flawless bak kulit telur Tidak kiralah apa warna kulit sekali pun sama ada putih sawo matang atau gelap Memiliki kulit flawless buat kita lebih yakin di khalayak ramai Bukan i...
Youtuber Ini Amp Quot Cipta Amp Quot Bully 2 Guna Unreal Engine 5

Youtuber Ini Amp Quot Cipta Amp Quot Bully 2 Guna Unreal Engine 5

papar berkaitan - pada 1/8/2022 - jumlah : 239 hits
Permainan video Bully merupakan sebuah game yang sangat nostalgia bagi mereka yang sempat merasainya terutamanya ketika zaman muda anda https twitter com IdleSloth84 status 1551711577807749121 ref src twsrc 5Etfw 7Ctwcamp 5Etweetembed 7Ctwt...
Cara Buat Donat Gebu Macam Span Guna Sukatan Cawan Mudah Gerenti Jadi

Cara Buat Donat Gebu Macam Span Guna Sukatan Cawan Mudah Gerenti Jadi

papar berkaitan - pada 29/7/2022 - jumlah : 295 hits
Donat antara kuih tradisional yang menjadi kegemaran ramai Tak kira kanak kanak atau orang dewasa kuih ni tak jemu dimakan Walaupun donat sekarang telah dimodenkan dengan pelbagai topping dan perisa tetapi donat kampung masih ada peminatnya...
Resipi Cekodok Jagung Lagi Manis Lembut Guna Jagung Dalam Tin

Resipi Cekodok Jagung Lagi Manis Lembut Guna Jagung Dalam Tin

papar berkaitan - pada 28/7/2022 - jumlah : 300 hits
Jika sebelum ini kita sediakan jagung segar dalam penghasilan cekodok jagung apa kata kali ini kita ubah kelainan menggunakan jagung krim dalam tin pula dalam cekodok kita Rasanya lebih manis dan berlemak Nak lebih sedap lagi tambahkan sedi...
3 Resipi Terlajak Sedap Guna Ikan Air Tawar Wajib Cuba

3 Resipi Terlajak Sedap Guna Ikan Air Tawar Wajib Cuba

papar berkaitan - pada 28/7/2022 - jumlah : 515 hits
Suka makan ikan air tawar Kalau ada yang suka boleh cuba tiga resipi yang boleh dikira autentik tapi sedapnya tak terkata Kalau nak makan di kedai memang jarang kita jumpa jadinya jom kita belajar buat sendiri Sesiapa yang nak mencuba silak...
Main Sapu Minyak Angin Pada Anak Tak Sedar Bahaya Dr Izzar Nasihatkan Elak Guna Pada Anak Bawah 2 Tahun

Main Sapu Minyak Angin Pada Anak Tak Sedar Bahaya Dr Izzar Nasihatkan Elak Guna Pada Anak Bawah 2 Tahun

papar berkaitan - pada 28/7/2022 - jumlah : 198 hits
Minyak angin tidak dinafikan melegakan sakit dan sengal sengal badan pada kita orang dewasa Namun tidak semua minyak angin ini baik untuk anak anak kecil kita Lebih lebih lagi minyak angin dengan kandungan sejenis bahan yang dinamakan Camph...
Sah Kes Najib Razak Cacat

Slot Qris Explained The Key To Faster And Safer Gaming Transactions

Rahsia Kawal Gula Dalam Darah Supaya Tak Melompat Lompat Lagi

Tremendous Nadi Collaboration

Kebaikan Rawatan Rendaman Kaki Bersama Garam Bukit Dan Ais Batu

Salam Dalam Salat Jenazah Sekali Atau Dua Kali

10 Praktik Keberlanjutan Yang Wajib Diterapkan Di Tahun 2025

Takwim Cuti Persekolahan Tahun 2025 2026


echo '';
5 Insiden Jalan Sesak Yang Berlaku Lebih 24 Jam Durasinya

Senarai Lagu Tugasan Konsert Minggu 6 Gegar Vaganza 2024 Musim 11

Keputusan Markah Peserta Konsert Minggu 5 Gegar Vaganza 2024 Musim 11

10 Filem Drama Seram Melayu Berhantu Terbaru 2024 2025 Mesti Tonton

One In A Million 2024 Senarai Peserta Juri Format Pemarkahan Hadiah Dan Segala Info Saksikan Live Di TV3 Malaysia Dan Tonton Calpis Soda OIAM


Farhan Mustapha Mutiara Hati Chord

The West Isn T Dying But It S Working On It

Malaysian Muslims Baffled How Having A Pic With Christmas Tree Santa Claus Can Shake Their Faith

Have A Relaxing Day With Friends Over Lunch Or Dinner

Icqs Bukit Kayu Hitam Sesak Luar Biasa Rakyat Malaysia Melancong Ke Thailand Diminta Jaga Adab

10 Proven Strategies For Raising Resilient Kids