iBATIS (বর্তমানে MyBatis নামে পরিচিত) হল একটি SQL Mapping Framework যা SQL স্টেটমেন্টের মাধ্যমে Java objects এর সাথে সম্পর্ক তৈরি করে। MyBatis-এর জন্য Unit Testing গুরুত্বপূর্ণ, কারণ এটি আপনার ডেটাবেস-ভিত্তিক কোডের কার্যকারিতা পরীক্ষা করতে সহায়তা করে, এবং কোডের রিগ্রেশন নিশ্চিত করতে সাহায্য করে।
MyBatis এর জন্য Unit Test তৈরি করার সময়, ডেটাবেস অপারেশন এবং SQL Mapper ফাইলের কার্যকারিতা পরীক্ষা করা হয়। সাধারণত, JUnit বা TestNG টেস্ট ফ্রেমওয়ার্ক ব্যবহার করা হয়। Mocking frameworks (যেমন Mockito বা PowerMock) এবং in-memory databases (যেমন H2 Database বা HSQLDB) ব্যবহার করা হয় যাতে ডেটাবেস নির্ভরতা কমানো যায় এবং টেস্টিং সহজ হয়।
এখানে, আমরা JUnit এবং H2 in-memory database ব্যবহার করে iBATIS/MyBatis এর জন্য Unit Test তৈরি করার পদ্ধতি আলোচনা করব।
Step 1: Maven Dependencies
প্রথমে, আপনার pom.xml ফাইলে প্রয়োজনীয় ডিপেনডেন্সি যোগ করতে হবে। এখানে JUnit, H2 Database, এবং MyBatis-Spring এর ডিপেনডেন্সি অন্তর্ভুক্ত করা হয়েছে।
<dependencies>
<!-- JUnit Dependency for Unit Testing -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<!-- H2 Database Dependency (In-memory DB) -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.200</version>
<scope>test</scope>
</dependency>
<!-- MyBatis Core Dependency -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!-- MyBatis-Spring Dependency for Integration with Spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<!-- Spring JDBC Support for Database Connectivity -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.8</version>
</dependency>
<!-- Mockito for Mocking (Optional) -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>3.9.0</version>
<scope>test</scope>
</dependency>
</dependencies>
- JUnit: টেস্টিং ফ্রেমওয়ার্ক
- H2 Database: ইন-মেমরি ডেটাবেস যা টেস্টিংয়ের জন্য ব্যবহার হবে
- MyBatis-Spring: Spring এবং MyBatis ইন্টিগ্রেশন
- Mockito: (ঐচ্ছিক) টেস্টিংয়ের জন্য মকিং ফ্রেমওয়ার্ক
Step 2: MyBatis Configuration for Unit Testing
MyBatis কনফিগারেশন ফাইলটি in-memory H2 database ব্যবহার করার জন্য কনফিগার করতে হবে।
mybatis-config.xml Example:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="test">
<environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="org.h2.Driver"/>
<property name="url" value="jdbc:h2:mem:test;DB_CLOSE_DELAY=-1"/>
<property name="username" value="sa"/>
<property name="password" value=""/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/example/mapper/EmployeeMapper.xml"/>
</mappers>
</configuration>
Explanation:
- H2 In-memory Database: H2 ডেটাবেসকে in-memory মোডে কনফিগার করা হয়েছে, যা টেস্টিংয়ের জন্য আদর্শ।
- TransactionManager:
JDBCটাইপের ট্রানজেকশন ম্যানেজার ব্যবহার করা হয়েছে।
Step 3: Mapper Interface and Mapper XML
এখন, Mapper Interface এবং Mapper XML তৈরি করতে হবে।
EmployeeMapper.java (Mapper Interface)
package com.example.mapper;
import com.example.model.Employee;
import java.util.List;
public interface EmployeeMapper {
List<Employee> getAllEmployees();
Employee getEmployeeById(int id);
void insertEmployee(Employee employee);
}
EmployeeMapper.xml (Mapper XML)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.EmployeeMapper">
<select id="getAllEmployees" resultType="com.example.model.Employee">
SELECT * FROM Employee
</select>
<select id="getEmployeeById" parameterType="int" resultType="com.example.model.Employee">
SELECT * FROM Employee WHERE id = #{id}
</select>
<insert id="insertEmployee" parameterType="com.example.model.Employee">
INSERT INTO Employee (name, position, salary)
VALUES (#{name}, #{position}, #{salary})
</insert>
</mapper>
Explanation:
- EmployeeMapper Interface:
EmployeeMapperইন্টারফেসের মধ্যে CRUD অপারেশন সংজ্ঞায়িত করা হয়েছে। - EmployeeMapper XML: SQL স্টেটমেন্ট (SELECT, INSERT) MyBatis XML ফাইলে লেখা হয়েছে এবং এটি ইন্টারফেসের সাথে ম্যাপ করা হয়েছে।
Step 4: Unit Test with JUnit
এখন JUnit টেস্ট ফাইল তৈরি করে MyBatis এর কনফিগারেশন, SQL Query এবং Mapper Interface টেস্ট করা যাবে।
EmployeeMapperTest.java (JUnit Test)
package com.example;
import com.example.mapper.EmployeeMapper;
import com.example.model.Employee;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
import java.io.InputStream;
import java.util.List;
public class EmployeeMapperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void setUp() throws Exception {
String resource = "mybatis-config.xml"; // MyBatis Configuration file
InputStream inputStream = getClass().getClassLoader().getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testInsertEmployee() {
try (SqlSession session = sqlSessionFactory.openSession()) {
EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);
Employee employee = new Employee("John Doe", "Developer", 75000);
employeeMapper.insertEmployee(employee);
session.commit();
Employee retrievedEmployee = employeeMapper.getEmployeeById(employee.getId());
assertNotNull(retrievedEmployee);
assertEquals("John Doe", retrievedEmployee.getName());
}
}
@Test
public void testGetAllEmployees() {
try (SqlSession session = sqlSessionFactory.openSession()) {
EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);
List<Employee> employees = employeeMapper.getAllEmployees();
assertNotNull(employees);
assertTrue(employees.size() > 0); // Ensure that the list is not empty
}
}
}
Explanation:
- setUp(): টেস্টের পূর্বে SqlSessionFactory কনফিগারেশন করা হয়।
- testInsertEmployee(): একটি নতুন Employee অবজেক্ট ইনসার্ট করা হয় এবং পরে তা ডেটাবেস থেকে ফেরত নিয়ে assert করা হয়।
- testGetAllEmployees(): সমস্ত Employee রেকর্ডকে ফেচ করে টেস্ট করা হয় যে সেগুলি খালি না।
Step 5: Run the Unit Test
JUnit টেস্ট রান করার জন্য, আপনি Maven বা IDE (যেমন IntelliJ IDEA বা Eclipse) এর মাধ্যমে টেস্টটি চালাতে পারেন।
Maven Command:
mvn test
এটি সমস্ত টেস্ট চালাবে এবং ফলাফল দেখাবে।
MyBatis (iBATIS) এর জন্য Unit Test তৈরি করা একটি গুরুত্বপূর্ণ প্রক্রিয়া যা ডেটাবেস অপারেশন এবং SQL স্টেটমেন্টের কার্যকারিতা পরীক্ষা করতে সাহায্য করে। এখানে, আমরা JUnit ব্যবহার করে in-memory H2 database এবং MyBatis কনফিগারেশন দিয়ে EmployeeMapper এর জন্য Unit Test তৈরি করার প্রক্রিয়া দেখেছি।
- SqlSession এবং SqlSessionFactory ব্যবহার করে Database Operations টেস্ট করা যায়।
- MyBatis Mapper ফাইল এবং SQL Queries পরীক্ষা করা যায়।
- H2 Database ব্যবহার করে ইন-মেমরি ডেটাবেসে ডেটাবেস অপারেশন টেস্ট করা যায়।
এটি ডেটাবেস-ভিত্তিক অ্যাপ্লিকেশনগুলির জন্য একটি কার্যকরী টেস্টিং পদ্ধতি।
Read more