Partial Mocks তৈরি

ইজিমক (EasyMock) - Java Technologies

315

Partial Mocks হল এমন মক অবজেক্ট যা কিছু মেথডের আচরণ সিমুলেট করে এবং কিছু মেথডে আসল কার্যকারিতা রাখে। সহজভাবে বলতে গেলে, Partial Mocks ব্যবহার করলে আপনি একটি ক্লাসের কিছু মেথড মক করতে পারেন এবং অন্যান্য মেথডগুলো বাস্তবায়ন রেখে দিতে পারেন। এটি সাধারণত তখন ব্যবহার করা হয় যখন আপনি কোনও ক্লাসের কিছু কার্যকলাপের জন্য মকিং করতে চান, কিন্তু পুরো ক্লাসটিকে মক করতে চান না।

EasyMock আপনাকে Partial Mocks তৈরি করার সুবিধা প্রদান করে, কিন্তু এটি একটি restriction রয়েছে: Partial mocks তৈরি করার জন্য আপনাকে ক্লাসের মেথডগুলির final, private, বা static মেথড ছাড়া শুধুমাত্র non-final মেথডগুলো মক করার সুযোগ দেয়।


Partial Mocks এর ব্যবহার

EasyMockPartial Mocks তৈরি করতে, আপনাকে createMock() এর পরিবর্তে createMockBuilder() ব্যবহার করতে হবে, যেখানে আপনি কিছু মেথডকে মক এবং কিছু মেথডকে বাস্তবায়ন রেখে দিতে পারেন।

Partial Mock তৈরি করার ধাপ:

  1. Mock Object Creation: EasyMock.createMockBuilder() ব্যবহার করে ক্লাসের মক তৈরি করা হয়।
  2. Expectation Setting: মক করা মেথডের জন্য expectations সেট করা হয়।
  3. Replay: মক অবজেক্টের আচরণ কার্যকরী করা হয়।
  4. Test Execution: টেস্ট চালানো হয় যেখানে মক অবজেক্টটি ব্যবহার করা হয়।
  5. Verification: যাচাই করা হয় যে মক অবজেক্টের মেথড সঠিকভাবে কল হয়েছে কিনা।

EasyMock এর Partial Mock তৈরি করার উদাহরণ

ধরা যাক, আমাদের একটি UserService ক্লাস রয়েছে যা UserDao ক্লাসের উপর নির্ভরশীল। getUserName() মেথডটি মক করা হবে, কিন্তু অন্য মেথড saveUser() বাস্তবায়ন থাকবে।

Step 1: UserDao ক্লাস

public class UserDao {
    public User findUserById(int id) {
        // প্রকৃত ডেটাবেস বা সার্ভিস কল
        return new User(id, "Real User");
    }

    public void saveUser(User user) {
        // প্রকৃত ডেটাবেস কল
        System.out.println("Saving user: " + user.getName());
    }
}

Step 2: UserService ক্লাস

public class UserService {
    private UserDao userDao;

    public UserService(UserDao userDao) {
        this.userDao = userDao;
    }

    public String getUserName(int id) {
        User user = userDao.findUserById(id);
        return user.getName();
    }

    public void saveUser(User user) {
        userDao.saveUser(user);
    }
}

Step 3: User ক্লাস

public class User {
    private int id;
    private String name;

    public User(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

Step 4: Partial Mock তৈরি করা

import org.easymock.EasyMock;
import org.junit.Before;
import org.junit.Test;

public class UserServiceTestWithPartialMock {

    private UserDao userDaoMock;
    private UserService userService;

    @Before
    public void setUp() {
        // Partial mock তৈরি করা
        userDaoMock = EasyMock.createMockBuilder(UserDao.class)
                               .addMockedMethod("findUserById") // findUserById মেথড মক করা হবে
                               .createMock();

        // UserService ইনস্ট্যান্স তৈরি করা এবং মক UserDao ইনজেক্ট করা
        userService = new UserService(userDaoMock);
    }

    @Test
    public void testGetUserName() {
        // Expectation সেট করা: findUserById মেথডে 1 ইনপুট দিলে একটি মক ইউজার রিটার্ন হবে
        User mockUser = new User(1, "John Doe");
        EasyMock.expect(userDaoMock.findUserById(1)).andReturn(mockUser);

        // Replay মক অবজেক্ট
        EasyMock.replay(userDaoMock);

        // টেস্ট চালানো
        String userName = userService.getUserName(1);

        // Assert করা
        System.out.println("User name: " + userName); // "John Doe"
        EasyMock.verify(userDaoMock);
    }

    @Test
    public void testSaveUser() {
        // SaveUser মেথডে কোন expectation সেট করা হয়নি, তাই এটি বাস্তবায়ন থাকবে
        User user = new User(1, "Jane Smith");
        userService.saveUser(user); // এখানে saveUser বাস্তবায়িত হবে
    }
}

ব্যাখ্যা:

  1. Partial Mock Creation:
    • EasyMock.createMockBuilder(UserDao.class).addMockedMethod("findUserById").createMock(); এই কোডে findUserById মেথডটিকে মক করা হয়েছে, তবে saveUser মেথডটি আসল (non-mocked) থাকবে।
  2. Expectation Setting:
    • EasyMock.expect(userDaoMock.findUserById(1)).andReturn(mockUser); এর মাধ্যমে আমরা নির্ধারণ করেছি যে, যখন findUserById(1) মেথডটি কল হবে, তখন এটি mockUser রিটার্ন করবে।
  3. Replay:
    • EasyMock.replay(userDaoMock); এর মাধ্যমে আমরা মক অবজেক্টটির কার্যকারিতা শুরু করেছি।
  4. Test Execution:
    • userService.getUserName(1) এবং userService.saveUser(user) মেথডগুলো কল করে টেস্ট রান করা হয়েছে। এখানে saveUser মেথডটি আসলভাবে কার্যকর হবে এবং findUserById মেথডটি মক করা হবে।
  5. Verification:
    • EasyMock.verify(userDaoMock); দিয়ে যাচাই করা হয় যে মক অবজেক্টের মেথড সঠিকভাবে কল হয়েছে কিনা।

Partial Mock এর সুবিধা:

  1. Specific Method Mocking:
    • আপনি চাইলে কিছু মেথড মক করতে পারেন এবং কিছু মেথড বাস্তবায়ন থাকতে পারে, যা পরীক্ষা করতে সাহায্য করে।
  2. Refining Tests:
    • যখন আপনার ক্লাসের কিছু মেথডকে মক করতে হয় এবং অন্যান্য মেথডের বাস্তব কার্যকারিতা রাখতে হয়, তখন Partial Mocks খুবই উপকারী।
  3. Flexibility:
    • Partial mocks আপনাকে class-level mocking ছাড়াই কেবলমাত্র নির্দিষ্ট মেথডগুলির জন্য mock behavior তৈরি করতে দেয়।

সারাংশ

Partial Mocks হল EasyMock এর একটি শক্তিশালী বৈশিষ্ট্য যা আপনাকে specific methods মক করতে দেয়, কিন্তু বাকি মেথডগুলিকে as is রাখতে সাহায্য করে। এই প্যাটার্নটি ব্যবহার করা হয় যখন আপনি ক্লাসের কিছু মেথডের কার্যকারিতা মক করতে চান এবং কিছু মেথডের জন্য আসল বাস্তবায়ন রাখতে চান। EasyMock এ Partial Mock তৈরি করতে, createMockBuilder() ব্যবহার করা হয় এবং addMockedMethod() এর মাধ্যমে মক করা মেথড নির্বাচন করা হয়।

Content added By

Partial Mocking হল একটি শক্তিশালী টেস্টিং কৌশল যা একটি বাস্তব অবজেক্টের কিছু অংশ মক করার জন্য ব্যবহৃত হয়, কিন্তু পুরো অবজেক্টকে মক করা হয় না। এর মাধ্যমে আপনি একটি অবজেক্টের কিছু মেথডকে প্রকৃত বাস্তবায়ন ব্যবহার করতে পারেন এবং কিছু মেথডকে মক করে পরীক্ষার জন্য কাস্টম আচরণ নির্ধারণ করতে পারেন।

EasyMockPartial Mocking এর মাধ্যমে, আপনি ক্লাসের বাস্তব মেথডগুলির কিছু অংশের পরিবর্তে মক মেথড ব্যবহার করতে পারেন, যখন অন্য মেথডগুলি তাদের প্রকৃত বাস্তবায়ন অনুযায়ী কাজ করবে। এটি খুবই কার্যকরী যখন আপনি একটি মেথডের কিছু নির্দিষ্ট আচরণ পরীক্ষা করতে চান কিন্তু অন্যান্য মেথডগুলির প্রকৃত কার্যকারিতা পরীক্ষা করতে চান।

Partial Mocking এর প্রয়োজনীয়তা

  • Efficiency: কিছু মেথডের জন্য মকিংয়ের মাধ্যমে কাস্টম আচরণ তৈরি করা, যখন বাকি মেথডগুলোকে প্রকৃত বাস্তবায়ন ব্যবহার করে চালানো যায়। এতে কোডের নমনীয়তা বজায় থাকে এবং কার্যকরী টেস্ট তৈরি করা যায়।
  • Legacy Code Testing: যখন আপনার কাছে একটি পুরানো কোড থাকে যা পুনরায় লেখা সম্ভব নয়, তখন Partial Mocking এর মাধ্যমে সেগুলোর টেস্ট করা যায়, বিশেষ করে যখন আপনি কিছু অংশ মক করে শুধু নির্দিষ্ট কার্যকারিতা পরীক্ষা করতে চান।

EasyMock এর মাধ্যমে Partial Mocking

EasyMock এ Partial Mocking করার জন্য createMock() এর পরিবর্তে createNiceMock() বা createMockBuilder() মেথড ব্যবহার করা হয়। তবে, সবচেয়ে সাধারণ পদ্ধতিটি হল mocking একটি বাস্তব অবজেক্টের জন্য শুধু নির্দিষ্ট মেথড এবং অন্যান্য মেথডের জন্য তাদের প্রকৃত কার্যকারিতা চালু রাখা।

Partial Mocking করার প্রক্রিয়া:

  1. Mock the class using EasyMock: মক অবজেক্ট তৈরি করুন।
  2. Define expectations for specific methods: কিছু নির্দিষ্ট মেথডের জন্য কাস্টম আচরণ নির্ধারণ করুন।
  3. Replay and verify: মক অবজেক্টকে রেপ্লে করুন এবং পরীক্ষাগুলি যাচাই করুন।

উদাহরণ: EasyMock এ Partial Mocking

ধরা যাক, আমাদের একটি UserService ক্লাস রয়েছে, যার মধ্যে কিছু মেথড রয়েছে যা বাস্তবায়ন করা হয়েছে, কিন্তু আমরা শুধুমাত্র একটি নির্দিষ্ট মেথড মক করতে চাই।

1. UserService ক্লাস:

public class UserService {
    private DatabaseService databaseService;

    public UserService(DatabaseService databaseService) {
        this.databaseService = databaseService;
    }

    public String getUserDetails(int userId) {
        // Imagine this method calls an external database to get user details
        return databaseService.fetchUserDetails(userId);
    }

    public String updateUserDetails(int userId, String details) {
        // Imagine this method updates user details in a database
        return "User details updated successfully";
    }
}

2. DatabaseService ক্লাস:

public class DatabaseService {
    public String fetchUserDetails(int userId) {
        // Actual database call (to be mocked in the test)
        return "User details from database";
    }
}

3. EasyMock with Partial Mocking:

import static org.easymock.EasyMock.*;

public class PartialMockingExample {
    public static void main(String[] args) {
        // Step 1: Create a real object (partial mock)
        DatabaseService databaseServiceMock = createMock(DatabaseService.class);

        // Step 2: Create a UserService object with the mock DatabaseService
        UserService userService = new UserService(databaseServiceMock);

        // Step 3: Set expectations on the mock object (only for fetchUserDetails)
        expect(databaseServiceMock.fetchUserDetails(1)).andReturn("Mocked user details");

        // Step 4: Activate the mock
        replay(databaseServiceMock);

        // Step 5: Test the methods
        System.out.println(userService.getUserDetails(1));  // Should print "Mocked user details"
        System.out.println(userService.updateUserDetails(1, "new details"));  // Should print "User details updated successfully"

        // Step 6: Verify the expectations
        verify(databaseServiceMock);
    }
}

Output:

Mocked user details
User details updated successfully

Partial Mocking এর প্রক্রিয়া:

  1. createMock(): createMock() ব্যবহার করে একটি মক অবজেক্ট তৈরি করা হয়েছে, কিন্তু এটি পুরো অবজেক্টের সব মেথড মক করছে না, বরং কিছু নির্দিষ্ট মেথড (এক্ষেত্রে fetchUserDetails) মক করা হয়েছে।
  2. expect(): expect() মেথডের মাধ্যমে শুধুমাত্র fetchUserDetails() মেথডের জন্য একটি কাস্টম আচরণ সেট করা হয়েছে।
  3. replay(): মক অবজেক্টটি replay() মেথড ব্যবহার করে একটিভেট করা হয়েছে।
  4. verify(): verify() মেথড ব্যবহার করে যাচাই করা হয়েছে যে মক অবজেক্টের মেথডটি প্রত্যাশিতভাবে কল হয়েছে কিনা।

Partial Mocking এর সুবিধা

  1. Reusable Real Methods: কিছু মেথডের জন্য বাস্তব কার্যকারিতা ব্যবহারের মাধ্যমে আপনি মক অবজেক্টের উপর অতিরিক্ত নির্ভরতা এড়িয়ে চলতে পারেন, যার ফলে কোড আরও পরিষ্কার এবং রক্ষণাবেক্ষণযোগ্য হয়।
  2. Efficiency: আপনি যখন কিছু মেথডকে মক করে টেস্ট করছেন, তখন সিস্টেমের বাকি অংশে আসল কার্যকারিতা ব্যবহার করতে পারেন, যা সময় এবং রিসোর্স সাশ্রয়ী।
  3. Test Isolation: মকিংয়ের মাধ্যমে আপনি কিছু নির্দিষ্ট আচরণ পরীক্ষা করতে পারবেন এবং অন্যান্য অংশের বাস্তবায়ন এড়াতে পারবেন।

Partial Mocking এর সীমাবদ্ধতা

  1. Complexity: কিছু ক্ষেত্রে, partial mocking কোডের জটিলতা বাড়াতে পারে, কারণ এটি বাস্তবায়ন এবং মকিংয়ের সংমিশ্রণ সৃষ্টি করে।
  2. Maintenance: বেশ কিছু মকিং কৌশল ব্যবহার করার সময় কোডের রক্ষণাবেক্ষণ কঠিন হতে পারে, বিশেষ করে যখন আসল এবং মক মেথডগুলির মধ্যে পার্থক্য খুব বেশি হয়ে যায়।

সারাংশ

Partial Mocking হল একটি শক্তিশালী টেস্টিং কৌশল যেখানে শুধুমাত্র একটি অবজেক্টের নির্দিষ্ট অংশ মক করা হয় এবং অন্যান্য অংশের বাস্তবায়ন ব্যবহার করা হয়। EasyMock এর মাধ্যমে এই প্রক্রিয়াটি খুবই সহজ হয়ে যায়, যেখানে মক অবজেক্ট তৈরি করা এবং তার আচরণ কাস্টমাইজ করা সম্ভব হয়। এটি সফটওয়্যার টেস্টিংকে আরও নমনীয় এবং কার্যকরী করে তোলে, বিশেষ করে যখন আপনি একটি ক্লাস বা অবজেক্টের নির্দিষ্ট মেথডগুলো পরীক্ষা করতে চান কিন্তু তার অন্য মেথডের বাস্তবায়ন কার্যকরী রাখতে চান।


Content added By

EasyMock এর partialMockBuilder() একটি শক্তিশালী বৈশিষ্ট্য যা আপনাকে partial mocks তৈরি করতে সাহায্য করে। Partial Mocking এর মাধ্যমে, আপনি একটি ক্লাসের কিছু মেথড মক করতে পারেন, তবে কিছু মেথডকে আসল অবস্থায় রেখে দিতে পারেন। এটি বিশেষভাবে উপকারী হয় যখন আপনি একটি ক্লাসের কিছু নির্দিষ্ট আচরণ পরীক্ষা করতে চান, কিন্তু ক্লাসের বাকি অংশের আচরণ পরিবর্তন করতে চান না। এই প্যাটার্নটি সাধারণত তখন ব্যবহার করা হয় যখন আপনি ক্লাসের আসল অবস্থা বা কার্যকারিতা কিছু অংশে পরীক্ষা করতে চান এবং বাকি অংশের মক আচরণ কন্ট্রোল করতে চান।

Partial Mocking কী?

Partial Mocking এর মাধ্যমে আপনি একটি ক্লাসের নির্দিষ্ট মেথডকে মক করেন, কিন্তু বাকি মেথডগুলি আসল অবস্থায় রেখে দেন। এটি বিশেষভাবে তখন ব্যবহার হয় যখন আপনি একটি ক্লাসের কিছু আচরণ মক করতে চান, কিন্তু এর কিছু ফাংশন বা মেথডের আসল আচরণ বজায় রাখতে চান। EasyMock.partialMockBuilder() আপনাকে একটি partial mock অবজেক্ট তৈরি করার সুযোগ দেয়।

EasyMock.partialMockBuilder() এর বৈশিষ্ট্য:

  • Partial Mock তৈরি করতে সক্ষম।
  • নির্দিষ্ট মেথডগুলো মক করার সুযোগ দেয়, কিন্তু বাকি মেথডগুলির আসল কার্যকারিতা বজায় থাকে।
  • মূলত, spy pattern এর মতো কাজ করে, যেখানে কিছু মেথডের আচরণ পরিবর্তন করা হয় এবং বাকি মেথড আসল থাকে।

partialMockBuilder() এর উদাহরণ:

ধরা যাক, আমাদের একটি BankAccount ক্লাস রয়েছে, যার একটি withdraw() মেথড এবং একটি deposit() মেথড রয়েছে। আমরা withdraw() মেথডটি মক করতে চাই, কিন্তু deposit() মেথডের আসল আচরণ বজায় রাখতে চাই। এর জন্য আমরা partialMockBuilder() ব্যবহার করব।

1. BankAccount Class

public class BankAccount {
    private double balance;

    public BankAccount(double initialBalance) {
        this.balance = initialBalance;
    }

    public double getBalance() {
        return balance;
    }

    public void deposit(double amount) {
        balance += amount;
    }

    public void withdraw(double amount) {
        if (amount > balance) {
            throw new IllegalArgumentException("Insufficient funds");
        }
        balance -= amount;
    }
}

2. EasyMock Test Case with partialMockBuilder()

import static org.easymock.EasyMock.*;
import org.junit.Test;
import static org.junit.Assert.*;

public class BankAccountTest {

    @Test
    public void testPartialMock() {
        // Create a partial mock for BankAccount
        BankAccount bankAccount = new BankAccount(1000);

        // Create a partial mock using EasyMock.partialMockBuilder()
        BankAccount partialMock = partialMockBuilder(BankAccount.class)
            .addMockedMethod("withdraw") // Mock the withdraw method
            .createMock();

        // Set expectations for the mocked method
        partialMock.deposit(500);
        expectLastCall().times(1); // Expect the deposit method to be called once
        
        partialMock.withdraw(100); // We don't need to define behavior for withdraw
        replay(partialMock);  // Switch the mock to replay mode

        // Call the methods
        partialMock.deposit(500);
        partialMock.withdraw(100);

        // Verify the behavior
        assertEquals(1500, partialMock.getBalance(), 0.01); // deposit should work as expected
        verify(partialMock);  // Verify that the mocked methods were called correctly
    }
}

ব্যাখ্যা:

  1. partialMockBuilder(BankAccount.class): এখানে BankAccount ক্লাসের একটি partial mock তৈরি করা হয়েছে।
  2. addMockedMethod("withdraw"): আমরা শুধুমাত্র withdraw() মেথডটি মক করছি, যা deposit() মেথডের আসল কার্যকারিতা পরিবর্তন করবে না।
  3. expectLastCall().times(1): আমরা আশা করি যে deposit() মেথডটি একবার কল হবে।
  4. replay(partialMock): মক অবজেক্টটি রিপ্লে মোডে সেট করা হয়, যাতে আমরা মক কন্ট্রোলের আচরণ পরীক্ষা করতে পারি।
  5. verify(partialMock): যাচাই করে দেখা হয় যে মক মেথডটি সঠিকভাবে কল হয়েছে কিনা।

Partial Mocking এর মাধ্যমে কী লাভ হবে?

  1. Test Specific Behaviors: আপনি মক করতে চান এমন মেথডগুলির আচরণ পরিবর্তন করে, কিন্তু বাকি মেথডগুলির আসল কার্যকারিতা রাখতে পারেন। এতে টেস্টের জন্য শুধুমাত্র প্রয়োজনীয় অংশ পরিবর্তন করা হয়।
  2. Performance Optimization: বড় এবং কমপ্লেক্স ক্লাসগুলির জন্য যখন কিছু অংশ মক করা প্রয়োজন হয় এবং কিছু অংশের আসল কার্যকারিতা রাখা হয়, তখন Partial Mocking খুবই কার্যকর।
  3. Code Flexibility: আপনি কেবলমাত্র যে মেথডগুলো পরীক্ষা করতে চান সেগুলোকেই মক করে বাকী অংশের কার্যকারিতা ঠিক রাখতে পারেন।

Partial Mocking এর সুবিধা এবং ব্যবহার

  1. Test Isolation: কিছু মেথড মক করার মাধ্যমে, আপনি কোডের নির্দিষ্ট অংশ পরীক্ষা করতে পারবেন, অন্যদিকে বাকি অংশের আসল আচরণ ঠিক থাকবে।
  2. Spy Behavior: Spy Pattern এর মতো, এটি মক অবজেক্টের কিছু অংশ পরিবর্তন করার সুযোগ দেয়।
  3. Reduced Complexity: কোডের মধ্যে নির্দিষ্ট অংশের মকিং করে, আপনি অন্যান্য অংশের আচরণ কন্ট্রোল না করে কোডের কার্যকারিতা পরীক্ষা করতে পারেন।

সারাংশ

EasyMock.partialMockBuilder() একটি শক্তিশালী টুল যা partial mocks তৈরি করতে ব্যবহৃত হয়, যেখানে আপনি একটি ক্লাসের কিছু মেথড মক করতে পারেন এবং বাকি মেথডের আসল আচরণ বজায় রাখেন। এটি আপনাকে টেস্টিং প্রক্রিয়ায় আরো flexibility এবং control দেয়, যেখানে আপনি শুধুমাত্র সিস্টেমের নির্দিষ্ট অংশ পরীক্ষার জন্য পরিবর্তন করতে পারেন, বাকী অংশের কার্যকারিতা অপরিবর্তিত থাকে।

Content added By

EasyMock হল একটি mocking framework যা ব্যবহার করে আপনি জাভা কোডের নির্দিষ্ট অংশ (যেমন মেথড কল) মক করতে পারেন। এটি আপনাকে শুধুমাত্র নির্দিষ্ট মেথডগুলির আচরণ নির্ধারণ করার সুযোগ দেয়, অন্যথায় আপনার আসল কোডের মধ্যে মকিং করতে না গিয়ে শূন্য থেকে কাজ করতে সক্ষম হয়।

অনেক সময়, আপনি পুরো অবজেক্টকে মক না করে, কেবল কিছু নির্দিষ্ট মেথড মক করতে চান। EasyMock এ আপনি এটি partial mocking বা mocking only specific methods হিসেবে করতে পারেন।

Partial Mocking বা নির্দিষ্ট মেথড মক করার জন্য EasyMock ব্যবহার করা

EasyMock সাধারণত পুরো অবজেক্ট মক করতে ব্যবহৃত হয়, কিন্তু কিছু সময় spy ব্যবহার করে আপনি partial mocking করতে পারেন। Partial mocking হলো এমন একটি প্রক্রিয়া যেখানে আপনি আসল অবজেক্টের কিছু মেথডকে মক করে, কিন্তু কিছু মেথড আসলভাবে কার্যকরী রেখে দেন। এটি বিশেষভাবে উপকারী যখন আপনার কাছে একটি বড় ক্লাস থাকে এবং আপনি তার কিছু মেথডের আচরণ পরীক্ষা করতে চান।

Partial Mocking এর জন্য spy ব্যবহার করা হয়।

EasyMock এ Partial Mocking এর ধাপসমূহ:

  1. Spy Object তৈরি করা: EasyMock.spy() মেথড ব্যবহার করে আপনি আসল অবজেক্টের একটি স্পাই তৈরি করতে পারেন।
  2. Method Stub করা: expect() মেথড দিয়ে আপনি শুধুমাত্র নির্দিষ্ট মেথডগুলির আচরণ স্টাব (stub) করতে পারেন।
  3. Replay Mode: replay() মেথড ব্যবহার করে মক অবজেক্টের আচরণ চালু করতে হবে।
  4. Verify: verify() মেথড ব্যবহার করে নিশ্চিত করতে হবে যে মক মেথডগুলি সঠিকভাবে কল হয়েছে।

উদাহরণ: EasyMock এ Partial Mocking

ধরা যাক, আমাদের একটি PaymentService ক্লাস রয়েছে এবং আমরা চাই PaymentGateway এর processPayment() মেথড মক করতে, কিন্তু getTransactionDetails() মেথডকে আসল অবস্থায় রেখে দিতে। আমরা এখানে EasyMock.spy() ব্যবহার করব যাতে getTransactionDetails() আসলেই কাজ করে, এবং processPayment() মেথডের জন্য কাস্টম স্টাবিং করা হয়।

১. PaymentGateway ক্লাস (Dependency)

public class PaymentGateway {
    public boolean processPayment(int amount) {
        // Real payment processing logic (e.g., API calls)
        return amount > 100;
    }

    public String getTransactionDetails() {
        return "Transaction details from PaymentGateway";
    }
}

২. PaymentService ক্লাস (Class Under Test)

public class PaymentService {
    private PaymentGateway paymentGateway;

    public PaymentService(PaymentGateway paymentGateway) {
        this.paymentGateway = paymentGateway;
    }

    public String makePayment(int amount) {
        if (paymentGateway.processPayment(amount)) {
            return "Payment successful. " + paymentGateway.getTransactionDetails();
        } else {
            return "Payment failed";
        }
    }
}

৩. Unit Test with Partial Mocking using EasyMock

import static org.easymock.EasyMock.*;
import org.junit.Test;
import static org.junit.Assert.*;

public class PaymentServiceTest {

    @Test
    public void testPartialMocking() {
        // Create a real object of PaymentGateway
        PaymentGateway realPaymentGateway = new PaymentGateway();

        // Create a spy of the real object
        PaymentGateway spyPaymentGateway = spy(realPaymentGateway);

        // Set up the expectation: mock only the processPayment method
        expect(spyPaymentGateway.processPayment(200)).andReturn(true);
        
        // Call the method that is not mocked (getTransactionDetails)
        replay(spyPaymentGateway);

        // Create PaymentService with the spy object
        PaymentService paymentService = new PaymentService(spyPaymentGateway);

        // Test the method under test
        String result = paymentService.makePayment(200);

        // Assert the result
        assertEquals("Payment successful. Transaction details from PaymentGateway", result);

        // Verify the behavior of the spy object
        verify(spyPaymentGateway);
    }

    @Test
    public void testPartialMockingFailure() {
        // Create a real object of PaymentGateway
        PaymentGateway realPaymentGateway = new PaymentGateway();

        // Create a spy of the real object
        PaymentGateway spyPaymentGateway = spy(realPaymentGateway);

        // Set up the expectation: mock only the processPayment method
        expect(spyPaymentGateway.processPayment(50)).andReturn(false);
        
        // Call the method that is not mocked (getTransactionDetails)
        replay(spyPaymentGateway);

        // Create PaymentService with the spy object
        PaymentService paymentService = new PaymentService(spyPaymentGateway);

        // Test the method under test
        String result = paymentService.makePayment(50);

        // Assert the result
        assertEquals("Payment failed", result);

        // Verify the behavior of the spy object
        verify(spyPaymentGateway);
    }
}

ব্যাখ্যা:

  1. Spy Object: আমরা spy() মেথড ব্যবহার করে আসল PaymentGateway অবজেক্টের একটি স্পাই তৈরি করেছি। এতে আমরা শুধুমাত্র processPayment() মেথডের জন্য স্টাবিং করেছি, কিন্তু getTransactionDetails() মেথড আসল অবস্থায় রাখা হয়েছে।
  2. Expectation Setup: expect() মেথডের মাধ্যমে আমরা processPayment(200) মেথডের জন্য একটি কাস্টম আচরণ নির্ধারণ করেছি। যখন এটি কল হবে, তখন true ফেরত দিবে।
  3. Replay Mode: replay(spyPaymentGateway) ব্যবহার করে আমরা স্পাই অবজেক্টের আচরণ চালু করেছি।
  4. Method Under Test: আমরা makePayment() মেথডে 200 টাকা পাঠিয়ে পরীক্ষণ করেছি, যেখানে processPayment() সফলভাবে পেমেন্ট সম্পন্ন করেছে এবং getTransactionDetails() মেথডটি আসল কার্যকারিতা প্রদান করেছে।
  5. Verification: verify(spyPaymentGateway) ব্যবহার করে নিশ্চিত করা হয়েছে যে processPayment() মেথড সঠিকভাবে কল হয়েছে।

EasyMock এর Partial Mocking এর সুবিধা:

  1. Efficiency: আপনি প্রয়োজন অনুযায়ী শুধুমাত্র কিছু মেথড মক করতে পারেন, পুরো অবজেক্টকে মক করার প্রয়োজন নেই।
  2. Flexibility: কিছু মেথডের আচরণ পরীক্ষার জন্য স্টাব করা এবং কিছু মেথডের আসল কার্যকারিতা রাখা সহজ হয়।
  3. Scalability: যখন আপনার কোডের নির্দিষ্ট অংশ পরীক্ষা করতে হয়, তখন partial mocking দ্রুত টেস্ট তৈরি করতে সাহায্য করে।

EasyMock এর Partial Mocking এর সীমাবদ্ধতা:

  1. Increased Complexity: কিছু সময় স্পাই অবজেক্ট ব্যবহার করা অতিরিক্ত জটিল হতে পারে, বিশেষ করে যখন মকিং এর জন্য অনেক মেথডের আচরণ নির্ধারণ করতে হয়।
  2. Not Recommended for Final Methods: EasyMock এর spy() মেথড final মেথড বা private মেথডের উপর কাজ করে না।

সারাংশ

EasyMock এর মাধ্যমে Partial Mocking বা specific methods mocking করা সম্ভব, যা একটি শক্তিশালী টুল। আপনি মক অবজেক্টের কিছু মেথডের আচরণ স্টাব করে, অন্য কিছু মেথডের আসল কার্যকারিতা বজায় রাখতে পারেন। spy() মেথডের সাহায্যে আপনি শুধু কিছু নির্দিষ্ট মেথডের জন্য কাস্টম স্টাবিং করতে পারেন এবং ইউনিট টেস্টিংয়ে আরো নমনীয়তা এবং দক্ষতা নিশ্চিত করতে পারেন।

Content added By

Partial Mocking হল একটি টেস্টিং কৌশল যেখানে আপনি একটি real object এর কিছু মেথড মক করে স্টাবিং করেন, কিন্তু কিছু মেথডের আচরণ ঐতিহ্যগতভাবে রাখা হয়। এর মাধ্যমে, আপনি কোনো অবজেক্টের মক আচরণ বজায় রাখতে পারেন এবং অন্যান্য মেথডগুলো তার আসল আচরণ (real behavior) অনুসরণ করতে থাকে। EasyMock আপনাকে partial mocking এর সুবিধা দেয়, যেখানে আপনি কিছু নির্দিষ্ট মেথডের জন্য মকিং করতে পারেন, কিন্তু বাকি মেথডগুলো বাস্তবসম্মত আচরণ বজায় থাকে।

এতে সফটওয়্যার টেস্টিং আরো efficiency এবং flexibility লাভ করে, কারণ পুরো অবজেক্টের পরিবর্তে শুধুমাত্র প্রয়োজনীয় অংশকে মক করা হয়।


1. Partial Mocking in EasyMock

EasyMock-এ আপনি partial mocking করার জন্য createMockBuilder() মেথড ব্যবহার করতে পারেন। এর মাধ্যমে, আপনি কোনো real object এর শুধুমাত্র কিছু মেথড মক করতে পারবেন, তবে বাকি মেথডগুলি আসল অবজেক্টের আচরণ অনুসরণ করবে।

উদাহরণ: Partial Mocking using createMockBuilder()

import static org.easymock.EasyMock.*;

public class PartialMockingExample {
    public static void main(String[] args) {
        // Create a partial mock of ArrayList
        List<String> list = createMockBuilder(ArrayList.class)
                             .addMockedMethod("size") // Mocking only 'size' method
                             .createMock();

        // Stubbing the 'size' method to return a custom value
        expect(list.size()).andReturn(10);

        // Activate the mock object
        replay(list);

        // Test the mocked method
        System.out.println("List size: " + list.size());  // Should print 10
        System.out.println("List is empty: " + list.isEmpty());  // Should print 'false' based on real behavior

        // Verify the interactions with the mock object
        verify(list);
    }
}

ব্যাখ্যা:

  • createMockBuilder(ArrayList.class): এটি ArrayList ক্লাসের একটি partial mock তৈরি করে, যেখানে আমরা শুধুমাত্র size() মেথডটি মক করছি।
  • addMockedMethod("size"): size() মেথডটি মক করার জন্য যুক্ত করা হয়েছে।
  • replay(list): মক অবজেক্টে স্টাবিং চালু করা হয়।
  • verify(list): মক অবজেক্টের মেথড কল ইন্টারঅ্যাকশন যাচাই করা হয়।

আউটপুট:

List size: 10
List is empty: false

2. Best Practices for Partial Mocking with EasyMock

Partial mocking করার সময় কিছু গুরুত্বপূর্ণ best practices অনুসরণ করা উচিত, যাতে আপনার টেস্টগুলি আরও নির্ভুল, রক্ষণাবেক্ষণযোগ্য এবং কার্যকরী হয়। এখানে কিছু প্রধান best practices দেওয়া হলো:

2.1 Avoid Overusing Partial Mocking

Partial mocking ব্যবহার করার সময়, এটি পরিমাণে সীমিত রাখা উচিত। যদি আপনার পুরো অবজেক্টের বেশিরভাগ মেথড মক করতে হয়, তবে পুরো অবজেক্টটি মক করা উচিত, কারণ খুব বেশি partial mocking কোডের জটিলতা বাড়িয়ে দিতে পারে।

Best Practice: Partial mocking শুধুমাত্র তখন ব্যবহার করুন যখন শুধুমাত্র কিছু নির্দিষ্ট মেথড মক করা প্রয়োজন এবং বাকি মেথডের আসল আচরণ বজায় রাখতে চান।

2.2 Keep Mocks and Real Behavior Separate

এটা গুরুত্বপূর্ণ যে, আপনি যখন partial mock ব্যবহার করেন, তখন নিশ্চিত করুন যে আপনি mocked methods এবং real behavior এর মধ্যে সঠিকভাবে পার্থক্য করতে পারেন। এটি কোডের পাঠযোগ্যতা এবং রক্ষণাবেক্ষণ উন্নত করতে সহায়তা করবে।

Best Practice: মক করা মেথড এবং আসল মেথডের মধ্যে স্পষ্ট পার্থক্য রাখুন। মক করা মেথডগুলি স্পষ্টভাবে চিহ্নিত করুন যাতে পরে অন্য কেউ এটি পরিবর্তন করলে বুঝতে পারে।

2.3 Use createMockBuilder() for Partial Mocking

EasyMock এর মাধ্যমে partial mocking করার সবচেয়ে সাধারণ পদ্ধতি হল createMockBuilder() ব্যবহার করা। এটি আপনাকে সহজে কিছু মেথড মক করতে সহায়তা করে এবং বাকি মেথডগুলিকে আসল আচরণ রাখতে দেয়।

Best Practice: createMockBuilder() ব্যবহার করুন যখন আপনাকে শুধুমাত্র কিছু মেথড মক করতে হবে।

2.4 Avoid Mocking Complex Logic

অন্য একটি গুরুত্বপূর্ণ ব্যাপার হল, complex logic অথবা business logic এর জন্য partial mocking না করা। যদি আপনার কোডে অনেক জটিল লজিক থাকে, তবে এটি মক করার চেয়ে integration tests ব্যবহার করা ভাল। মকিং সাধারণত শুধুমাত্র ছোট, নির্দিষ্ট ফাংশনালিটির জন্য উপকারী।

Best Practice: জটিল লজিকের জন্য partial mocking না করে প্রকৃত ইউনিট টেস্ট বা ইনটিগ্রেশন টেস্ট ব্যবহার করুন।

2.5 Verify Interactions

যখন partial mock ব্যবহার করা হয়, তখন মক অবজেক্টের মেথড কল ইন্টারঅ্যাকশন যাচাই করা অত্যন্ত গুরুত্বপূর্ণ। নিশ্চিত করুন যে মক অবজেক্টের মেথড সঠিকভাবে কতবার এবং কোন আর্গুমেন্টের সাথে কল করা হয়েছে তা যাচাই করা হয়েছে।

Best Practice: verify() মেথড ব্যবহার করে মক অবজেক্টের মেথড কল ইন্টারঅ্যাকশন যাচাই করুন।

2.6 Use Custom Matchers for Specific Behavior

যদি আপনার মক অবজেক্টের কিছু মেথড নির্দিষ্ট কন্ডিশনের ভিত্তিতে আচরণ করতে হয়, তবে custom matchers ব্যবহার করতে পারেন। এতে partial mock আরও কার্যকরী হবে এবং এটি আপনার টেস্টকে আরও নির্দিষ্ট করে তুলবে।

Best Practice: Custom matchers ব্যবহার করে আপনার টেস্টের আচরণ কাস্টমাইজ করুন, যাতে মক অবজেক্টের আচরণ আরও সূক্ষ্মভাবে নিয়ন্ত্রণ করা যায়।


Partial Mocking হল একটি গুরুত্বপূর্ণ কৌশল যা ইউনিট টেস্টিংয়ে অনেক কাজে আসে। EasyMock এর মাধ্যমে আপনি partial mock তৈরি করে নির্দিষ্ট মেথডগুলির আচরণ মক করতে পারেন, যখন বাকি মেথডগুলি আসল আচরণ অনুসরণ করবে। Best practices অনুসরণ করে আপনি partial mocking এর মাধ্যমে আরো পরিষ্কার, কার্যকরী এবং রক্ষণাবেক্ষণযোগ্য টেস্ট তৈরি করতে পারবেন।

এছাড়া, EasyMock এর createMockBuilder() মেথড, custom matchers, এবং verify() মেথড ব্যবহার করে আপনার মক অবজেক্টের আচরণকে আরও সুনির্দিষ্ট ও কার্যকরীভাবে কাস্টমাইজ করতে পারবেন।

Content added By
Promotion

Are you sure to start over?

Loading...