iBATIS (MyBatis) ব্যবহার করে Mock Database এবং SQL Testing করার জন্য বিভিন্ন পদ্ধতি ব্যবহার করা যেতে পারে। Mocking ডেটাবেসের সাথে সরাসরি ইন্টারঅ্যাকশন করার পরিবর্তে একটি প্র্যাকটিক্যাল ও নিরাপদ উপায় হতে পারে, বিশেষ করে যদি আপনি ডেটাবেসে কোনো প্রকৃত পরিবর্তন করতে না চান বা আপনি দ্রুত টেস্ট করতে চান।
এই গাইডে, Mock Database এবং SQL Testing এর জন্য কিছু সাধারণ পদ্ধতি এবং টুলস ব্যবহার করার পদ্ধতি আলোচনা করা হবে, যেমন Mockito এবং MyBatis Testing ফ্রেমওয়ার্ক।
1. Mock Database for iBATIS (MyBatis)
Mock Database ব্যবহার করার মাধ্যমে আপনি ডেটাবেসের উপর নির্ভর না থেকে unit tests চালাতে পারেন। Mockito এর মতো মকিং ফ্রেমওয়ার্ক ব্যবহার করে, আপনি MyBatis মেপার বা মেথডগুলোর জন্য মক অবজেক্ট তৈরি করতে পারেন।
Step 1: Add Mockito and JUnit Dependencies in pom.xml
<dependencies>
<!-- JUnit for Unit Testing -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.7.1</version>
<scope>test</scope>
</dependency>
<!-- Mockito for Mocking Dependencies -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>3.7.7</version>
<scope>test</scope>
</dependency>
<!-- MyBatis for testing SQL (if needed) -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
<scope>test</scope>
</dependency>
</dependencies>
- JUnit: এটি unit test লেখার জন্য ব্যবহৃত হয়।
- Mockito: এটি আপনার মক অবজেক্ট তৈরি করার জন্য ব্যবহৃত হয়, বিশেষ করে যখন আপনি ডেটাবেস অপারেশনগুলিকে মক করতে চান।
- MyBatis: টেস্টের জন্য MyBatis-এর প্রয়োজনীয় ডিপেনডেন্সি।
Step 2: Create a Mocked SqlSession with Mockito
Mockito ব্যবহার করে MyBatis এর SqlSession এবং Mapper ইন্টারফেসের মক তৈরি করতে পারেন।
import org.mockito.Mockito;
import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.Test;
import static org.mockito.Mockito.*;
public class EmployeeMapperTest {
@Test
public void testGetEmployeeById() {
// Create a mock SqlSession
SqlSession mockSqlSession = Mockito.mock(SqlSession.class);
// Create a mock Mapper (EmployeeMapper)
EmployeeMapper mockMapper = mock(SqlSession.class);
// Set up the mock behavior for the getEmployeeById method
Employee mockEmployee = new Employee(1, "John Doe", "john.doe@example.com");
when(mockSqlSession.getMapper(EmployeeMapper.class)).thenReturn(mockMapper);
when(mockMapper.getEmployeeById(1)).thenReturn(mockEmployee);
// Call the method
Employee employee = mockMapper.getEmployeeById(1);
// Assert the result
assertNotNull(employee);
assertEquals("John Doe", employee.getName());
}
}
Explanation:
- Mockito.mock(SqlSession.class):
SqlSessionএর একটি মক অবজেক্ট তৈরি করা হয়েছে। - mockMapper.getEmployeeById(1):
getEmployeeByIdমেথডটি মক করা হয়েছে যা একটিEmployeeঅবজেক্ট রিটার্ন করবে। - Assertions: টেস্টের শেষে, আমরা নিশ্চিত করছি যে মক করা ডেটাবেস থেকে রিটার্ন হওয়া
Employeeঅবজেক্ট সঠিক।
Step 3: Use @Mock Annotation (Optional)
Mockito এর @Mock অ্যানোটেশন ব্যবহার করে মকিং আরও সহজ করা যায়।
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.mockito.Mockito.*;
@ExtendWith(MockitoExtension.class)
public class EmployeeServiceTest {
@Mock
private EmployeeMapper employeeMapper;
@InjectMocks
private EmployeeService employeeService;
@Test
public void testAddEmployee() {
// Mock the insert method
Employee employee = new Employee(1, "John", "john@example.com");
doNothing().when(employeeMapper).insertEmployee(any(Employee.class));
employeeService.addEmployee(employee);
// Verify if the insert method was called
verify(employeeMapper, times(1)).insertEmployee(employee);
}
}
@Mock: মক অবজেক্ট তৈরি করার জন্য ব্যবহৃত হয়।@InjectMocks: টেস্ট ক্লাসে মক অবজেক্ট ইনজেক্ট করার জন্য ব্যবহৃত হয়।
2. SQL Testing in iBATIS (MyBatis)
MyBatis এর SQL টেস্ট করার জন্য আমরা মক ডেটাবেস বা ইন-মেমরি ডেটাবেস ব্যবহার করতে পারি, যেমন H2 ডাটাবেস, যা ইন-মেমরি ডেটাবেস হিসেবে ব্যবহৃত হয় এবং টেস্ট করার জন্য আদর্শ।
Step 4: Configure H2 Database for SQL Testing
H2 Database একটি ইন-মেমরি ডাটাবেস যা MyBatis এর সাথে টেস্ট করার জন্য উপযুক্ত।
<dependencies>
<!-- H2 Database for In-memory Database Testing -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.200</version>
<scope>test</scope>
</dependency>
</dependencies>
Step 5: Create MyBatis Configuration for Testing
MyBatis টেস্ট কনফিগারেশন এবং SqlSessionFactory সেটআপ করুন।
<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:testdb;DB_CLOSE_DELAY=-1"/>
<property name="username" value="sa"/>
<property name="password" value=""/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/yourpackage/mapper/EmployeeMapper.xml"/>
</mappers>
</configuration>
- H2 Database: এটি ইন-মেমরি ডাটাবেস যেটি টেস্টিংয়ের জন্য ব্যবহৃত হবে এবং DB_CLOSE_DELAY=-1 এর মাধ্যমে ডাটাবেস চলমান থাকবে যতক্ষণ না JVM বন্ধ হবে।
Step 6: Write a Test for SQL Execution
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.io.Resources;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import static org.junit.jupiter.api.Assertions.*;
public class EmployeeMapperTest {
@Test
public void testInsertEmployee() throws IOException {
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
try (SqlSession session = sqlSessionFactory.openSession()) {
EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);
// Insert test data
Employee employee = new Employee(1, "John Doe", "john.doe@example.com");
employeeMapper.insertEmployee(employee);
session.commit();
// Verify that the employee is inserted
Employee insertedEmployee = employeeMapper.getEmployeeById(1);
assertNotNull(insertedEmployee);
assertEquals("John Doe", insertedEmployee.getName());
}
}
}
Explanation:
sqlSessionFactory.openSession(): MyBatis সেশনের একটি ইনস্ট্যান্স খোলা হয়েছে।employeeMapper.insertEmployee(employee):EmployeeMapperএর মাধ্যমে ইনসার্ট অপারেশন পরীক্ষা করা হচ্ছে।assertNotNull(): নিশ্চিত করা হচ্ছে যে ডেটাবেসে ইনসার্ট হওয়াEmployeeঅবজেক্ট পাওয়া গেছে।
iBATIS (MyBatis) এর সাথে Mock Database এবং SQL Testing করার জন্য আপনি Mockito, JUnit, এবং H2 Database এর মতো টুলস ব্যবহার করতে পারেন:
- Mocking: Mockito ব্যবহার করে
SqlSessionএবংMapperইন্টারফেস মক করে আপনি টেস্ট করতে পারেন। - SQL Testing: H2 Database ব্যবহার করে ইন-মেমরি ডাটাবেসে SQL কুয়েরি চালাতে পারেন এবং MyBatis-এ SQL এক্সিকিউশন টেস্ট করতে পারেন।
- JUnit and Mockito: JUnit এবং Mockito এর মাধ্যমে MyBatis মেথডগুলি এবং SQL কুয়েরিগুলোর কার্যকারিতা পরীক্ষা করতে পারেন।
এই পদ্ধতিগুলির সাহায্যে আপনি একটি সহজ, কার্যকরী এবং নির্ভরযোগ্য টেস্টিং পরিবেশ তৈরি করতে পারবেন যা প্রকৃত ডেটাবেসে পরিবর্তন না করে টেস্ট করার সুযোগ দেয়।
Read more