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 : 220 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 : 267 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 : 450 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 : 245 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 : 301 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 : 308 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 : 523 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 : 203 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...
Lelaki Tular Tampar Isteri Ditahan Pagi Tadi

Sibu Boy Tiong Shines Light On City In Visit Malaysia Campaign

Bufet Ramadan 2025 Wtckl Tawar Laman Tradisi Dengan Lebih 300 Hidangan Tahun Ini

Mont Kiara Traffic A Nightmare

Celebrate Love At Pavilion Hotel Kuala Lumpur

Akmal Must Reflect On Why Non Malays Dislike Him Says Mca Veep

Nasi Briyani Adabi

Free Sample Libresse Knowyourv


echo '';
Senarai Lagu Tugasan Konsert Akhir Gegar Vaganza 2024 2025 Musim 11 Minggu 12

Keputusan Markah Peserta Konsert Minggu 11 Gegar Vaganza 2024 2025 Musim 11 Separuh Akhir

5 Undang Undang Aneh Berkait Bendera Kebangsaan di Seluruh Dunia

Benarkah Kajian Sains Membolehkan Gigi Manusia Tumbuh Selepas Hilang

4 Puncak Tertinggi Negara Dunia Yang Paling Ketot Saiznya


Day Trip Ke Pantai Teluk Cempedak Dan Menara 118 Kuantan Pahang

Perry Feat Zee Avi Romantisa Chord

Melihat Gunung Kinabalu Dari Daradaat View

Kejadian Ikut Hukum Alam

Pengambilan Jawatan Ppj Februari 2025

Waktu Solat Bandar Baharu Kulim Kedah 03 02 2025