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?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+Interpretzz+(interpretZZ)

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
Lukis Kening Teknik Gam Atau Guna Concealer Haram Ke Dalam Islam

Lukis Kening Teknik Gam Atau Guna Concealer Haram Ke Dalam Islam

papar berkaitan - pada 3/3/2019 - jumlah : 781 hits
Kuasa solekan memang tidak dapat dinafikan lagi dapat mengubah wajah seseorang dari biasa kepada terlalu menawan Ia seperti pembedahan plastik sementara yang tidak menyakitkan dan boleh diubah mengikut kepuasan hati sendiri Di arus media so...
Sandar Pada Bahu Duduk Dukung Atau Meniarap Guna 4 Cara Mudah Ini Untuk Sendawakan Bayi

Sandar Pada Bahu Duduk Dukung Atau Meniarap Guna 4 Cara Mudah Ini Untuk Sendawakan Bayi

papar berkaitan - pada 14/2/2019 - jumlah : 850 hits
Sandar pada bahu duduk dukung atau meniarapkan badannya adalah antara cara yang boleh mama lakukan untuk sendawakan bayi Ia penting kalau nak elak bayi kembung dan tidak terganggu Menyendawakan bayi ialah satu kewajipan setiap kali selepas ...
Kerjasama Pas Umno Tidak Guna Simbol Baru

Kerjasama Pas Umno Tidak Guna Simbol Baru

papar berkaitan - pada 6/3/2019 - jumlah : 248 hits
KUALA LUMPUR Umno dan PAS hari ini mengumumkan kerjasama secara rasmi yang akan memfokuskan aspek penyatuan ummah kata Timbalan Presiden Umno Datuk Seri Mohamad Hasan Beliau berkata kerjasama itu bukan gabungan Umno dan PAS sebagai parti ba...
Pahang Guna Puisi Bantu Murid Pra Sekolah Kuasai Bahasa Inggeris

Pahang Guna Puisi Bantu Murid Pra Sekolah Kuasai Bahasa Inggeris

papar berkaitan - pada 5/3/2019 - jumlah : 411 hits
Imej via BernamaKUANTAN Modul bahasa Inggeris Let s Rhyme akan mula digunakan secara berperingkat di 19 buah pra sekolah di seluruh daerah ini dalam usaha membantu murid menguasai bahasa itu dengan lebih pantas Ketua Penolong Pengarah Bahag...
Jus Buah Ini Elok Untuk Gusi Anak Cegah Gusi Berdarah Resipi Mudah Hanya Guna 4 Bahan Sahaja

Jus Buah Ini Elok Untuk Gusi Anak Cegah Gusi Berdarah Resipi Mudah Hanya Guna 4 Bahan Sahaja

papar berkaitan - pada 5/3/2019 - jumlah : 535 hits
Mengunyah sebiji epal atau meminum jusnya setiap hari sudah cukup untuk membekalkan khasiat bagi mengurangkan kandungan kolesterol dalam badan Manakala timun pula mampu menggantikan kehilangan air dari badan kerana timun mengandungi air Sel...
Padah Guna Nombor Pendaftaran Bossku Seorang Remaja Ditahan

Padah Guna Nombor Pendaftaran Bossku Seorang Remaja Ditahan

papar berkaitan - pada 6/3/2019 - jumlah : 314 hits
Padah Guna Nombor Pendaftaran BOSSKU Seorang Remaja DitahanTular di media sosial Video berdurasi lebih satu minit itu memperlihatkan seorang remaja lelaki sedang membuang nombor pendaftaran sebuah motosikal yang dikatakan menggunakan Bossku...
Guna Alasan Akaun Yang Pindah Wang Sudah Over Limit Individu Menyamar Lelaki Ini Kaut Untung Atas Angin

Guna Alasan Akaun Yang Pindah Wang Sudah Over Limit Individu Menyamar Lelaki Ini Kaut Untung Atas Angin

papar berkaitan - pada 7/3/2019 - jumlah : 493 hits
Guna Alasan Akaun yang Pindah Wang Sudah Over Limit Individu Menyamar Lelaki Ini Kaut Untung Atas Angin Belum sembuh lara di hati selepas pemergian isteri tercinta yang baru dinikahi kurang empat bulan seorang pemuda terkejut apabila ada in...
Kanak Kanak Datang Ke Masjid Patut Atau Tidak

Kanak Kanak Datang Ke Masjid Patut Atau Tidak

papar berkaitan - pada 14/2/2019 - jumlah : 497 hits
Assalamualaikum Hi Semua Kanak Kanak Datang Ke Masjid Patut Atau Tidak Pelbagai jenis penerimaan daripada orang sekeliling terutamanya jemaah masjid dan surau surau apabila adanya kanak kanak yang datang ke masjid dan surau surau semata mat...
Cairan Pra Ejakulasi Atau Air Madzi Boleh Sebabkan Kehamilan Ini Penjelasan Pakar

Cairan Pra Ejakulasi Atau Air Madzi Boleh Sebabkan Kehamilan Ini Penjelasan Pakar

papar berkaitan - pada 14/2/2019 - jumlah : 762 hits
Untuk mana mana pasangan yang tidak merancang kehamilan pasti anda tertanya tanya adakah cairan pra ejakulasi dapat menyebabkan kehamilan Ha jom kita semak tentang isu ini menurut pandangan pakar Ramai sebenarnya yang keliru antara cairan e...
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