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 : 250 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 : 283 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 : 502 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 : 267 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 : 338 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 : 337 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 : 542 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 : 217 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...
Kembara Ke Wilayah Yunnan Dan Wilayah Jiangsu Di China

Kisah Pokok Tumbang Depan Rumah

Single Use Plastic Bags Banned In Forest Reserves National Parks

Main Bunga Api Waktu Siang Pun Boleh

Loko Pemuda Chord

Bangun Subuh Hafazan Malam Latihan Berkuda Petang Beginilah Heba Dilatih Jadi Juara Hidup

Keputusan Spm 2024 Diumumkan 24 April 2025

Ketua Editor Pereka Grafik Akhbar Tempatan Ditahan Untuk Siasatan Sudah Dibebaskan


echo '';
Info Dan Sinopsis Drama Berepisod Dendam Seorang Madu Slot Tiara Astro Prima

10 Fakta Biodata Amira Othman Yang Digosip Dengan Fattah Amin Penyanyi Lagu Bila Nak Kahwin

5 Tips Macam Mana Nak Ajak Orang Kita Suka Dating Dengan Kita

Info Dan Sinopsis Drama Berepisod Keluarga Itu Slot Lestary TV3

Bolehkah Manusia Transgender Mencapai Klimaks Selepas Bertukar


Jadikan Gambar Kepada Anime Gibli

Cinta Diri

Malaysians Respond To Us Tv Host S No Money Comment By Calling His Mother Green

Malaysia Airlines A330 300 Takes To The Skies In Manchester United Livery

Kahwini Wanita Tempatan Warga Asing Nikmati Hidup Mewah Dengan Pendapatan Rm55 000 Sebulan

Timbul Dakwaan Zahnita Bagi Lelaki Masuk Rumah Suami Akui Terkejut Bila Ada Orang Lain Anak Anak Pun Mengeluh