Mock Database এবং SQL Testing

iBATIS এবং Unit Testing - আইবাটিস (iBATIS) - Java Technologies

388

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 এর মতো টুলস ব্যবহার করতে পারেন:

  1. Mocking: Mockito ব্যবহার করে SqlSession এবং Mapper ইন্টারফেস মক করে আপনি টেস্ট করতে পারেন।
  2. SQL Testing: H2 Database ব্যবহার করে ইন-মেমরি ডাটাবেসে SQL কুয়েরি চালাতে পারেন এবং MyBatis-এ SQL এক্সিকিউশন টেস্ট করতে পারেন।
  3. JUnit and Mockito: JUnit এবং Mockito এর মাধ্যমে MyBatis মেথডগুলি এবং SQL কুয়েরিগুলোর কার্যকারিতা পরীক্ষা করতে পারেন।

এই পদ্ধতিগুলির সাহায্যে আপনি একটি সহজ, কার্যকরী এবং নির্ভরযোগ্য টেস্টিং পরিবেশ তৈরি করতে পারবেন যা প্রকৃত ডেটাবেসে পরিবর্তন না করে টেস্ট করার সুযোগ দেয়।

Content added By
Promotion

Are you sure to start over?

Loading...