Catatan

Menunjukkan catatan yang berlabel JUnit4

Mock Static Function dengan PowerMockito

PowerMockito adalah satu library yang sangat membantu semasa kita menulis unit test untuk kod yang menggunakan function static yang menyukarkan kita untuk menggunakan mock. Ini adalah beberapa kes yang telah Tedi gunakan semasa menyiapkan kerja sekolah. TransactionAspectSupport.currentTransactionStatus().setRollbackOnly() Mula-mula set @RunWith dan @PrepareForTest @RunWith(PowerMockRunner.class) @PrepareForTest({TransactionAspectSupport.class}) Kemudian set apa behaviour kita nak:     @Before    public void setUp() throws Exception {            MockitoAnnotations.initMocks(this);     PowerMockito.mockStatic(TransactionAspectSupport.class);     TransactionStatus transactionStatus = PowerMockito.mock(TransactionStatus.class);     PowerMockito.when(TransactionAspectSupport.currentTransactionStatus()).thenReturn(transactionStatus);     PowerMockito.doNothing().when(transactionStatus).setRollback...

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 class Ralat 2: Unable to set internal state on a private field Ralat 1: Cannot subclass final class Kesimpulannya 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.mocki...

Behaviour Driven Development

بِسْـــــــــمِ ï·²ِالرَّØ­ْÙ…َÙ†ِ الرَّØ­ِيم Projek mem-BDD kan unit test. Hari ini bermula satu tugas untuk menulis unit test yang ala-ala BDD. Bidaah je tu BDD. Kononnya nak bage developer terlepas  test case dalam  unit test mereka. Tapi tidak mengapalah, layan sahajalah. Ini adalah bahan rujukan Tedi semasa menjalankan kerja-kerja menampakkan  unit test bukan BDD seolah-olah seekor BDD. JUnit Params Salah satu benda yang perlu ada ialah kebolehan untuk hantar parameter kepada  unit test , jadi  developer tidak perlu menulis  unit test yang sama untuk data yang berbeza. BDD-kah ini? B-daah ye. https://dzone.com/articles/working-with-junitparams Mockito Bukan senang nak buat  unit test terutamanya jika kod itu tak patuh TDD. Nasib baik ada library seperti Mockito yang membantu kita mock apa yang perlu. https://www.vogella.com/tutorials/Mockito/article.html

Verify function dalam class yang ditulis Unit Test itu sendiri

Kali ini Tedi nak periksa (verify) sesuatu function dipanggil dalam service yang sedang kita unit test. Jadi langkah pertama kita spy-kan dia. public class OutletCheckAplusBizTest { public static final String COMMON_OUTLET_ID = "outletId"; public static final String APLUS_OUTLET_ID = "outletId"; @Mock AntRestfulApi antRestfulApi; @Mock OutletDetailService outletDetailService; @Mock Logger log; @Spy @InjectMocks OutletCheckBiz outletCheckBiz; Seterusnya kita sudah boleh periksa function-nya sendiri. Harus diingat bahawa  function itu haruslah  public atau minimum  protected . Jika  private maka kenalah cari jalan lain. @Test public void testProcess() { when(antRestfulApi.callMerchantOutletCreate(any(MerchantOutletCreateRequest.class))).thenReturn(null); when(antRestfulApi.callMerchantOutletQuery(any(MerchantOutletQueryRequest.class))).thenReturn(null); when(outletDetailService.updateOutletDetail(any(OutletDe...

Mock New Instance Creation Gunakan PowerMockito

alhamdulillah, setelah berusaha selama 3 jam untuk membantu kawan Tedi siapkan baiki unit test dia, akhir selesai juga. Tedi dah mengantuk benar ni. Masalahnya dalam unit test dia tu tak konsisten keputusan yang dihasilkan. Di local Intellij Idea Tedi fail, pada mesin kawan Tedi, okay pula. Run dalam sonar local Tedi dan kawan Tedi, dua-dua pass. Masalah besar ialah ia sentiasa fail dalam SonarQube server. Tension betul sebab kalau tak lepas gatekeeper ni memang code ni takkan dapat merge ke dalam branch hotfix. Gunakan branch hotfix malam ni sebab ada isu produksi. Akhirnya pemilik unit test ni beri idea untuk mock creation of new FileOutputStream, sebab Tedi asyik dapat FileNotFoundException. Setelah tersengguk-sengguk memikirkan solusi, akhirnya ketemui jua cara mock new instance creation. @Test public void testWrite() throws Exception { FileOutputStream fileOut = Mockito.mock(FileOutputStream.class); PowerMockito.whenNew(FileOutputStream.class).withAnyArguments().then...

Popular