Hibernate testing হল Hibernate ORM এর সাথে সম্পর্কিত কোডের ইউনিট টেস্টিং করার প্রক্রিয়া। Hibernate এর মাধ্যমে ডেটাবেস পরিচালনা করা হয় এবং এর মধ্যে entity objects তৈরি, CRUD (Create, Read, Update, Delete) অপারেশন চালানো, এবং ডেটাবেস টেবিলের সাথে সম্পর্কিত কার্যক্রম পরীক্ষা করা হয়।
JUnit এবং Mockito ব্যবহার করে Hibernate এর জন্য ইউনিট টেস্ট তৈরি করা সহজ। JUnit দিয়ে টেস্ট কেসগুলো রান করা হয় এবং Mockito দিয়ে মকিং (mocking) করা হয়। মকিংয়ের মাধ্যমে আপনি ডেটাবেস ইন্টারঅ্যাকশন ছাড়া টেস্ট করতে পারেন।
JUnit এবং Mockito দিয়ে Hibernate টেস্টিং
Hibernate টেস্টিং করার জন্য মূলত দুই ধরনের টেস্টিং করা হয়:
- Unit Testing: যেখানে শুধুমাত্র Java classes টেস্ট করা হয়, এবং ডেটাবেস ইন্টারঅ্যাকশন মক করা হয়।
- Integration Testing: যেখানে Hibernate এবং ডেটাবেসের ইন্টিগ্রেশন টেস্ট করা হয় (হালকা ডেটাবেস বা ইন-মেমরি ডেটাবেস ব্যবহার করে)।
Step-by-Step Hibernate Testing with JUnit and Mockito
Step 1: Maven Dependencies
Hibernate Testing এর জন্য আপনি JUnit, Mockito, এবং Hibernate এর জন্য প্রয়োজনীয় ডিপেন্ডেন্সি pom.xml ফাইলে যোগ করবেন।
<dependencies>
<!-- JUnit Dependency -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.7.0</version>
<scope>test</scope>
</dependency>
<!-- Mockito Dependency for mocking -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>3.7.7</version>
<scope>test</scope>
</dependency>
<!-- Hibernate Core Dependency -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.6.0.Final</version>
<scope>test</scope>
</dependency>
<!-- H2 Database Dependency (For in-memory DB testing) -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.200</version>
<scope>test</scope>
</dependency>
</dependencies>
- JUnit: Unit testing এর জন্য।
- Mockito: Mocking ডেটাবেস এবং Hibernate এর সাথে সম্পর্কিত objects মক করার জন্য।
- Hibernate Core: Hibernate এর জন্য ডিপেন্ডেন্সি।
- H2 Database: ইন-মেমরি ডেটাবেস যা Hibernate টেস্টিংয়ের জন্য ব্যবহৃত হবে।
Step 2: Hibernate Entity Class (Employee.java)
একটি Employee entity তৈরি করা হবে, যেটি Hibernate দ্বারা পরিচালিত হবে।
import javax.persistence.*;
@Entity
@Table(name="employee")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
private int id;
@Column(name="name")
private String name;
@Column(name="salary")
private double salary;
// Constructors, Getters, Setters
public Employee() {}
public Employee(String name, double salary) {
this.name = name;
this.salary = salary;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
এখানে:
- @Entity: Entity কে ডেটাবেস টেবিলের সাথে সম্পর্কিত করে।
- @Id: Primary Key হিসেবে
idফিল্ডটি চিহ্নিত করে। - @GeneratedValue: Hibernate কে বলে যে
idফিল্ডটি অটো-জেনারেট হবে।
Step 3: Hibernate Utility Class
Hibernate সেশন তৈরি করার জন্য একটি utility ক্লাস তৈরি করা হবে।
import org.hibernate.*;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static SessionFactory factory;
static {
try {
factory = new Configuration().configure("hibernate.cfg.xml")
.addAnnotatedClass(Employee.class)
.buildSessionFactory();
} catch (Exception e) {
e.printStackTrace();
}
}
public static Session getSession() {
return factory.getCurrentSession();
}
public static void close() {
factory.close();
}
}
এখানে:
- SessionFactory তৈরি করা হয়েছে যা Hibernate সেশন তৈরি করবে।
Step 4: Unit Test with JUnit and Mockito
এখন, আমরা Employee entity এর জন্য একটি JUnit test case তৈরি করব। আমরা Mockito ব্যবহার করে Session মক করব এবং Hibernate এর কার্যকারিতা টেস্ট করব।
JUnit Test Class
import static org.mockito.Mockito.*;
import org.junit.jupiter.api.*;
import org.hibernate.*;
public class EmployeeTest {
private Session session;
@BeforeEach
public void setUp() {
session = mock(Session.class); // Mocking Hibernate Session
}
@Test
public void testSaveEmployee() {
Employee employee = new Employee("John Doe", 50000);
// Saving employee using mock session
when(session.save(employee)).thenReturn(1);
// Invoking the save method
session.save(employee);
// Verifying if save method was called
verify(session).save(employee);
// Validating expected results
Assertions.assertNotNull(employee.getId()); // Assert that id was generated
}
@Test
public void testUpdateEmployee() {
Employee employee = new Employee("Jane Doe", 60000);
employee.setId(1);
// Updating employee using mock session
doNothing().when(session).update(employee);
// Invoking the update method
session.update(employee);
// Verifying update method was called
verify(session).update(employee);
}
@Test
public void testDeleteEmployee() {
Employee employee = new Employee("John Smith", 40000);
employee.setId(2);
// Deleting employee using mock session
doNothing().when(session).delete(employee);
// Invoking the delete method
session.delete(employee);
// Verifying delete method was called
verify(session).delete(employee);
}
@AfterEach
public void tearDown() {
session.close();
}
}
এখানে:
- Mockito ব্যবহার করে
Sessionমক করা হয়েছে, যাতে আমরা Hibernate সেশন ব্যবহার না করে টেস্টটি সম্পন্ন করতে পারি। - save(), update(), এবং delete() মেথডগুলো মক করা হয়েছে এবং verify() মেথড দিয়ে নিশ্চিত করা হয়েছে যে সেগুলো সঠিকভাবে কল হয়েছে।
- Assertions ব্যবহার করে টেস্টের মধ্যে বিভিন্ন চেক করা হয়েছে (যেমন, employee ID কীভাবে প্রজন্মিত হয়)।
Step 5: Integration Testing (Using In-memory Database)
মকিংয়ের মাধ্যমে ইউনিট টেস্ট করলেও, Hibernate-এর বাস্তব কার্যকারিতা টেস্ট করার জন্য integration test করা জরুরি। এর জন্য আমরা H2 Database ব্যবহার করে ইন-মেমরি ডেটাবেসে Hibernate টেস্ট করব।
import org.hibernate.*;
import org.hibernate.cfg.Configuration;
import org.junit.jupiter.api.*;
public class EmployeeIntegrationTest {
private static SessionFactory factory;
private Session session;
@BeforeAll
public static void setUp() {
factory = new Configuration().configure("hibernate.cfg.xml")
.addAnnotatedClass(Employee.class)
.buildSessionFactory();
}
@BeforeEach
public void startTransaction() {
session = factory.getCurrentSession();
session.beginTransaction();
}
@Test
public void testSaveEmployee() {
Employee employee = new Employee("Alice", 70000);
session.save(employee);
Assertions.assertNotNull(employee.getId()); // Assert that the employee is saved and id is generated
}
@Test
public void testRetrieveEmployee() {
Employee employee = session.get(Employee.class, 1); // Assuming ID 1 exists
Assertions.assertNotNull(employee);
System.out.println("Retrieved Employee: " + employee.getName());
}
@AfterEach
public void commitAndClose() {
session.getTransaction().commit();
session.close();
}
@AfterAll
public static void closeSessionFactory() {
factory.close();
}
}
এখানে:
- In-memory database ব্যবহারের মাধ্যমে Hibernate সেশন এবং ডেটাবেস ইন্টিগ্রেশন টেস্ট করা হয়েছে।
session.get()এবংsession.save()ব্যবহার করে ডেটাবেসে ডেটা রিট্রিভ এবং সেভ করা হয়েছে।
Hibernate এর সাথে JUnit এবং Mockito ব্যবহার করে আপনি Hibernate ORM এর বিভিন্ন কার্যকারিতা টেস্ট করতে পারেন। Mockito মকিং টুল হিসেবে Hibernate সেশন, ট্রানজেকশন এবং অন্যান্য ডেটাবেস অপারেশনগুলোকে মক করতে সাহায্য করে। JUnit দিয়ে টেস্ট কেসগুলি পরিচালনা করা হয় এবং integration testing এর মাধ্যমে Hibernate-এ বাস্তব ডেটাবেস ইন্টিগ্রেশন টেস্ট করা হয়। JUnit, Mockito, এবং Hibernate এর সমন্বয়ে, আপনি একটি শক্তিশালী টেস্টিং কৌশল তৈরি করতে পারেন যা আপনার কোডের স্থিতিশীলতা এবং কার্যকারিতা নিশ্চিত করে।
Read more