21 January 2012

Menggunakan TestNG dalam penggunaan Framework Spring dan Hibernate

Pembaca yang budiman, saat saya menulis artikel ini, saya sudah kurang lebih 2 bulan terdaftar sebagai karyawan baru pada sebuah perusahaan IT Consultant di Jakarta. Tapi bukan itu yang ingin saya share dalam tulisan kali ini. Dalam perusahaan ini, saya diharapkan bisa mengikuti development stack yang berlaku diperusahaan ini. Salah satunya adalah penggunaan Spring Framework dan Hibernate.
Sejak saya mengenal dunia pemrograman Java, terus terang saya akui bahwa saya memang tidak pernah melibatkan framework hibernate sebagai sebuah metode ORM(Object Relational Mapping) dalam development stack project-project yang pernah saya buat. Kalau Spring Framework, saya memang sudah aktif menggunakannya sejak dua tahun lalu. Keadaan ini membuat saya sedikit harus beradaptasi terhadap framework hibernate ini.
Saya sering menemui kesulitan yang sangat menguras emosi jika code-code dalam dao layer yang saya hadapi mulai menggunakan Hibernate Criteria. mungkin bagi pembaca yang biasa menggunakan framework hibernate, Criteria adalah makanan sehari-hari, jadi tidak akan pernah ada kesulitan, saya sangat yakin dengan hal tersebut. Sementara saya, benar-benar baru sentuh framework hibernate ini, jadi buat saya ini sangat menguras emosi saya.
Untuk mengetahui sebuah method dalam dao layer itu sudah berfungsi dengan baik atau belum, terkadang sangat tidak efektif sekali jika saya melakukan test dengan cara mendeploy seluruh aplikasi hanya untuk mengetest sebuah fungsi dao yang saya buat dalam dao layer. Dan akhirnya saya memutuskan untuk mengujji fungsi-fungsi dao layer ini menggunakan unit-test, sehingga saya tidak perlu men-deploy keseluruhan aplikasi.
Oke, dibawah ini adalah langkah-langkah dalam membuat unit test guna pengujian fungsi-fungsi dao layer yang dibuat dengan menggunakan Spring Framework dan Hibernate:
  1. Buat file hibernate configuration, Spring Context, dan semua file pendukung dalam dan letakkan dalam folder test/resources seperti gambar berikut ini:                                                                                                                                                                                                                                                                   
  2. Buat sebuah file bernama TestDao dan letakkan di dalam folder test/java. Adapun isi file tersebut seperti contoh berikut ini: 
 package com.mojo.maven.test;  
   
 import com.mojo.maven.dao.NewsCategoryDao;  
 import com.mojo.maven.dao.NewsDao;  
 import com.mojo.maven.model.News;  
 import com.mojo.maven.model.NewsCategory;  
 import org.apache.log4j.Logger;  
 import org.hibernate.SessionFactory;  
 import org.hibernate.classic.Session;  
 import org.hibernate.context.ManagedSessionContext;  
 import org.springframework.beans.factory.annotation.Autowired;  
 import org.springframework.test.context.ContextConfiguration;  
 import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;  
 import org.testng.annotations.AfterMethod;  
 import org.testng.annotations.BeforeMethod;  
 import org.testng.annotations.Test;  
   
 @ContextConfiguration(locations={"classpath*:maven1ApplicationContext-test.xml"})  
 public class TestDao extends AbstractTestNGSpringContextTests{  
   private Logger logger = Logger.getLogger(TestDao.class);  
   
   @Autowired  
   public SessionFactory sessionFactory;  
   private Session session;  
   
   @Autowired  
   private NewsDao newsDao;  
   
   @Autowired  
   private NewsCategoryDao newsCategoryDao;  
   
   /**  
    * Inisialisasi hibernate context sebelum test  
    */  
   @BeforeMethod  
   void init() {  
     logger.debug("init session factory");  
     session = sessionFactory.openSession();  
     ManagedSessionContext.bind(session);  
   }  
   
   /**  
    * cleanup hibernate context setelah test  
    */  
   @AfterMethod  
   void destroy() {  
     logger.debug("destroy session factory");  
     session.close();  
     ManagedSessionContext.unbind(sessionFactory);  
   }  
   
   @Test  
   public void testGetNews(){  
     News news = newsDao.getById(1);  
     logger.info("News ID : " + news.getId());  
     logger.info("News Title : " + news.getNewsTitle());  
     logger.info("News URL : " + news.getNewsUrl());  
     logger.info("News Category : " + news.getNewsCategory().getCategoryName());  
     logger.info("News Category Description : " + news.getNewsCategory().getCategoryDescription());  
   }  
 }  
   
 .......  
 .......  
   

Yang harus kita perhatikan pada class tersebut adalah, class tersebut memiliki annotation @ContextConfiguration dan meng-extends class AbstractTestNGSpringContextTests yang memang diperuntukkan sebagai basis class untuk melakukan test dengan menggunakan Framework TestNG. Dalam annotation @ContextConfiguration didefinisikan pula lokasi dari Spring Context sehingga compiler dapat menemukan letak file Spring Context yang akan digunakan dalam test itu sendiri.
Hal berikutnya yang harus kita perhatikan adalah dua method yang ada dalam class tersebut, yaitu method void init() dan method void destroy(). Pada method void init, diberikan pula annotation @BeforeMethod yang berfungsi sebagai inisialisasi hibernate context sebelum method test lainnya dijalankan. Sementara  method void destroy() diberikan diberikan annotation @AfterMethod yang berfungsi menutup session hibernate setelah method test selesai di eksekusi.
Demikianlah yang bisa saya share untuk sementara ini. Jika memang percobaan diatas dirasakan masih kurang, silahkan pembaca semua mengembangkannya lagi agar lebih sempurna.



Semoga bermanfaat.

Josescalia

No comments: