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 : 205 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 : 249 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 : 436 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 : 232 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 : 289 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 : 293 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 : 505 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 : 190 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...
Beli Rumah Lebih Jimat Dengan Kempen Hartanah Bumiputera Matrix

Natural Gas Fuel Not A Hazard

How Car Centric Planning Is Killing Malaysians

Masjid Lapangan Terbang Sultan Abdul Aziz Shah

Khutbah Jumat Jumadil Awal Tangis Ibnu Rawahah Jelang Perang Mu Tah

Bersatu Man Demands Dnb Exit Strategy For U Mobile

15 Playful Midcentury Kids Room Ideas For A Retro Vibe

Tattoos Raised And Itchy


echo '';
Senarai Lagu Tugasan Konsert Minggu 1 Gegar Vaganza 2024 Musim 11

Info Dan Sinopsis Drama Berepisod Dhia Kasyrani Slot Akasia TV3

Biodata Terkini Reshmonu Peserta Gegar Vaganza 2024 Musim 11 GV11 Penyanyi Lagu Hey Waley

Gegar Vaganza 2024 GV 11 Hadiah Tiket Peserta Juri Format Pemarkahan Dan Segala Info Tonton Live Di Astro Ria Dan Sooka

6 Janji Donald Trump Kalau Dia Naik Jadi Presiden Semula


Kelas Tauhid Bersama Sofea

Flexibility In Business Operations

Semua Ni Sebab Chagee

Takwim Persekolahan Sesi 2025 2026

Buat Sendiri Roti Arab Lembut Gebu Sekali Hadap Boleh Habis 3 Keping

Sihir Ep1