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 : 733 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 : 797 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 : 218 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 : 365 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 : 486 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 : 278 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 : 453 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 : 464 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 : 685 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...
Transit Aliran Automatik Di Putrajaya Percuma Selama Tiga Bulan

Rumah Terbuka Wld Raya 2024

Pramugari Malaysia Airlines Meninggal Dunia Tak Sempat Pulang Ke Tanah Air

Biodata Shalin Zulkifli Ratu Boling Tenpin Negara

Tutorial Cara Daftar Asb Online Dan Cara Semak Asb Guna Ic

Apa Itu Wang What Is Money

Doubletree By Hilton Presents Signatures Across The State A Makan Kitchen Showcase

Beyond Lettuce Wraps Unleash The Power Of Low Carb Bread



10 Fakta Biodata MK K Clique Pelakon Drama Berepisod Aku Bukan Ustazah TV3 Gandingan Erysha Emyra Yang Beristerikan Siti Hajaar Syeikh Nordin

Info Dan Sinopsis Drama Berepisod Bunga Salju Slot Tiara Astro Ria

Info Dan Sinopsis Drama Berepisod Anggun Mikayla Viu Malaysia

Keputusan Markah Mingguan Senarai Lagu Tugasan The Hardest Singing Show Astro Malaysia

Biodata Syad Mutalib Pelakon Drama Berepisod Aku Bukan Ustazah TV3 Bunga Salju Astro Ria


Duit Dalam Akaun Bank Arwah Hilang Sebelum Tuntutan Pusaka Selesai

Makanan Kucing Terbaik Kenapa Kucing Perlukannya

Al Ikhsan Sports Spend And Win

Cuci Karpet

Lambstongues The Benefits Of Plastic Downspouts Over Metal Alternatives

Beyond The High Exploring The Therapeutic Uses Of Thca Flower In Houston