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 : 822 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 : 902 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 : 294 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 : 462 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 : 576 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 : 340 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 : 525 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 : 536 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 : 855 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...
Maggi Pes Perapan Air Fryer

Back To School Just Got A Banana Powered Boost

Drama Pasca Kau Pergi

The Acquittal Of Yusoff Rawther Of Drug Trafficking And Possession Of Fake Pistols Points To Massive Police Frame Up

No You Re Not Crazy Setting Boundaries With Your Spouse S Family

Hari Lautan Sedunia Bahtera Bidong Dalam Sorotan Kajian Saintifik Dan Sejarah Maritim Nusantara

15 Resipi Jus Beetroot Dan Manfaat Kesihatan Untuk Diamalkan

Detik Detik Pesawat Air India Terhempas Nasib 242 Penumpang Dalam Tanda Tanya


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


Jangan Risau Kalau Terlambat Bertemu Jodoh Mungkin Jodohmu Masih Belum Lahir

Buasir Otak Tv Bila Cikgu Rindu Murid Murid Lepas Habis Cuti Sekolah Be Like

Pengajaran Daripada Tragedi Kemalangan Bas Pelajar Upsi

F N Magnolia And Illumination S Minions Unleash Banana Fuelled Mischief Across Malaysia

Kegagalan Enjin Semasa Berlepas Punca Utama Kemalangan Pesawat

Topeng Simpati Wasapa Pada Lembut Yang Beracun