JUnit এবং Mockito ব্যবহার করে Hibernate Testing

Hibernate Testing এবং Debugging - হাইবারনেট (Hibernate) - Java Technologies

357

Hibernate testing হল Hibernate ORM এর সাথে সম্পর্কিত কোডের ইউনিট টেস্টিং করার প্রক্রিয়া। Hibernate এর মাধ্যমে ডেটাবেস পরিচালনা করা হয় এবং এর মধ্যে entity objects তৈরি, CRUD (Create, Read, Update, Delete) অপারেশন চালানো, এবং ডেটাবেস টেবিলের সাথে সম্পর্কিত কার্যক্রম পরীক্ষা করা হয়।

JUnit এবং Mockito ব্যবহার করে Hibernate এর জন্য ইউনিট টেস্ট তৈরি করা সহজ। JUnit দিয়ে টেস্ট কেসগুলো রান করা হয় এবং Mockito দিয়ে মকিং (mocking) করা হয়। মকিংয়ের মাধ্যমে আপনি ডেটাবেস ইন্টারঅ্যাকশন ছাড়া টেস্ট করতে পারেন।

JUnit এবং Mockito দিয়ে Hibernate টেস্টিং

Hibernate টেস্টিং করার জন্য মূলত দুই ধরনের টেস্টিং করা হয়:

  1. Unit Testing: যেখানে শুধুমাত্র Java classes টেস্ট করা হয়, এবং ডেটাবেস ইন্টারঅ্যাকশন মক করা হয়।
  2. 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 এর সমন্বয়ে, আপনি একটি শক্তিশালী টেস্টিং কৌশল তৈরি করতে পারেন যা আপনার কোডের স্থিতিশীলতা এবং কার্যকারিতা নিশ্চিত করে।

Content added By
Promotion

Are you sure to start over?

Loading...