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 : 166 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 : 202 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 : 392 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 : 193 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 : 208 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 : 258 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 : 412 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 : 156 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...
Court Allows Forfeiture Of Rm1 1mil From Illegal Deposit Taking Scheme Investors

Keningau Fa Buat Kejutan Gol Awal

Wanita Mca Calls On Govt To Tackle Brain Drain Generate Job Opportunities

Malayia S Forex Trading Landscape Opportunities And Challenges

Gsk Raya Open House Dan Minggu Imunisasi Sedunia

Tukar Kanta Mata Untuk Melihat Seni Politik Anwar

The Dab 1a A Limited Edition Electric Production Motorcycle From France

Muda Slams Pro Israel Us Professor S Remark At Local Varsity Talk



Biodata Rozana Rozek TV Youtuber Resipi

8 Istilah Jerman Yang Kita Rakyat Malaysia Kerap Gunakan

Biodata Aizat Saha Pelakon Drama Berepisod Racun Rihanna TV3 Personaliti TikTok

Kenapa Platipus Haiwan Yang Membuatkan Saintis Merasa Hairan

Biodata Qistina Rania Pelakon Drama Berepisod Bercakap Dengan Jun Astro Ria Peserta Hero Dewi Remaja 2023


Nearly 500 Lawsuits Filed Against Sabah Govt Hajiji

Ukraine Approaching Total Collapse

Police Probe Chaos Incident Outside Mosque In Penang

Budaya Pot Luck Jimat Kos Makanan Lebih Banyak Pilihan

Vivo Malaysia Memperkenalkan Inisiatif Eksklusif Untuk Pengguna Celcomdigi Di Malaysia

Meet Studio Your New Favorite Way To Develop Wordpress Locally