Custom Argument Matcher তৈরি

Argument Matchers ব্যবহার - ইজিমক (EasyMock) - Java Technologies

334

EasyMock একটি শক্তিশালী মকিং ফ্রেমওয়ার্ক, যা আপনি mock objects এবং stubbing করতে ব্যবহার করতে পারেন। কখনও কখনও আপনাকে টেস্টিংয়ের সময় বিশেষ ধরনের আর্গুমেন্টের জন্য মকিং করতে হতে পারে, যা EasyMock এর ডিফল্ট আর্গুমেন্ট ম্যাচার দ্বারা ক্যাপচার করা সম্ভব নয়। এই ক্ষেত্রে, আপনি Custom Argument Matcher তৈরি করতে পারেন।

Custom Argument Matcher হল এমন একটি ক্লাস যা ArgumentMatcher ইন্টারফেসকে বাস্তবায়িত করে এবং কাস্টম যুক্তি যাচাই করতে ব্যবহার করা হয়। এটি আপনাকে মক অবজেক্টে নির্দিষ্ট আর্গুমেন্টের জন্য কাস্টম শর্তাদি প্রয়োগ করতে দেয়।

ArgumentMatcher Interface:

EasyMock তে ArgumentMatcher ইন্টারফেস ব্যবহার করা হয়। এই ইন্টারফেসের মাধ্যমে আপনি কাস্টম ম্যাচিং লজিক তৈরি করতে পারেন। এর প্রধান মেথডগুলো হল:

  • matches(Object arg): এই মেথডটি আর্গুমেন্ট মেচ করে, এবং যদি এটি কাস্টম শর্ত পূর্ণ করে তবে true ফেরত দেয়।
  • appendTo(StringBuffer buffer): এটি ম্যাচারের একটি টেক্সট রিপ্রেজেন্টেশন তৈরি করতে ব্যবহৃত হয় (ডিবাগিং বা লগিং জন্য)।

Custom Argument Matcher তৈরি করার ধাপ:

  1. ArgumentMatcher ইন্টারফেস ইমপ্লিমেন্ট করুন
  2. matches() মেথডে কাস্টম লজিক তৈরি করুন
  3. appendTo() মেথডে প্রয়োজনীয় ডিবাগging স্টেটমেন্ট যোগ করুন

উদাহরণ: Custom Argument Matcher তৈরি করা

ধরা যাক, আমাদের একটি PaymentService ক্লাস রয়েছে এবং আমরা PaymentGateway এর processPayment() মেথডে কাস্টম আর্গুমেন্ট ম্যাচিং করতে চাই। আমরা এমন একটি কাস্টম ম্যাচার তৈরি করব যা amount এর মান যাচাই করবে এবং তা যদি greater than 100 হয়, তবে আমরা তা মক করে সঠিক আউটপুট ফেরত দেব।

১. PaymentGateway ক্লাস (Dependency)

public class PaymentGateway {
    public boolean processPayment(int amount) {
        // Payment processing logic
        return amount > 100;  // Simulating successful payment for amounts > 100
    }
}

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

public class PaymentService {
    private PaymentGateway paymentGateway;

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

    public String makePayment(int amount) {
        boolean success = paymentGateway.processPayment(amount);
        return success ? "Payment successful" : "Payment failed";
    }
}

৩. Custom Argument Matcher

import org.easymock.ArgumentMatcher;

// Custom Argument Matcher Class
class GreaterThan100Matcher implements ArgumentMatcher<Integer> {
    @Override
    public boolean matches(Integer argument) {
        return argument != null && argument > 100;
    }

    @Override
    public void appendTo(StringBuffer buffer) {
        buffer.append("greater than 100");
    }
}

৪. Unit Test with Custom Argument Matcher

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

public class PaymentServiceTest {

    @Test
    public void testPaymentWithCustomArgumentMatcher() {
        // Create a mock object for PaymentGateway
        PaymentGateway mockPaymentGateway = createMock(PaymentGateway.class);

        // Set up expectation using the custom argument matcher
        expect(mockPaymentGateway.processPayment(argThat(new GreaterThan100Matcher()))).andReturn(true);
        replay(mockPaymentGateway);

        // Create PaymentService instance with the mock PaymentGateway
        PaymentService paymentService = new PaymentService(mockPaymentGateway);

        // Call the method under test with amount 150
        String result = paymentService.makePayment(150);

        // Assert that the payment was successful
        assertEquals("Payment successful", result);

        // Verify that the mock method was called
        verify(mockPaymentGateway);
    }

    @Test
    public void testPaymentWithInvalidAmount() {
        // Create a mock object for PaymentGateway
        PaymentGateway mockPaymentGateway = createMock(PaymentGateway.class);

        // Set up expectation using the custom argument matcher for invalid amount
        expect(mockPaymentGateway.processPayment(argThat(new GreaterThan100Matcher()))).andReturn(true);
        replay(mockPaymentGateway);

        // Create PaymentService instance with the mock PaymentGateway
        PaymentService paymentService = new PaymentService(mockPaymentGateway);

        // Call the method under test with amount 50
        String result = paymentService.makePayment(50);

        // Assert that the payment was not successful
        assertEquals("Payment failed", result);

        // Verify that the mock method was called
        verify(mockPaymentGateway);
    }
}

ব্যাখ্যা:

  1. GreaterThan100Matcher: এই ক্লাসটি ArgumentMatcher ইন্টারফেসকে ইমপ্লিমেন্ট করে এবং matches() মেথডে কাস্টম লজিক দেয় যা amount এর মান 100 এর চেয়ে বেশি কিনা যাচাই করে।
  2. Unit Test: এখানে, processPayment() মেথডে argThat() ব্যবহার করে কাস্টম ম্যাচারকে যুক্ত করা হয়েছে, যা PaymentService ক্লাসে PaymentGateway এর মক অবজেক্টের জন্য কাস্টম আর্গুমেন্ট যাচাই করে।
    • প্রথম টেস্টে 150 টাকা দিয়ে সফল পেমেন্ট পরীক্ষা করা হয়েছে।
    • দ্বিতীয় টেস্টে 50 টাকা দিয়ে ব্যর্থ পেমেন্ট পরীক্ষা করা হয়েছে।

Test Case 1 (Valid Payment):

  • Input: 150 টাকা
  • Expected Output: "Payment successful"
  • Explanation: 150 টাকা দিয়ে greater than 100 চেক সফল হয়েছে এবং পেমেন্ট সফল হয়েছে।

Test Case 2 (Invalid Payment):

  • Input: 50 টাকা
  • Expected Output: "Payment failed"
  • Explanation: 50 টাকা দিয়ে greater than 100 চেক ব্যর্থ হয়েছে এবং পেমেন্ট ব্যর্থ হয়েছে।

EasyMock এ Custom Argument Matcher এর সুবিধা:

  1. Custom Validation: আপনি যেকোনো আর্গুমেন্টের জন্য কাস্টম লজিক তৈরি করতে পারেন যা ডিফল্ট ম্যাচার দ্বারা সঠিকভাবে যাচাই করা সম্ভব নয়।
  2. Code Maintainability: আপনার টেস্ট কোডে জটিল লজিক প্রয়োগ করতে সহায়তা করে, যেটি পরে পরিবর্তন বা সম্প্রসারণ সহজ করে তোলে।
  3. Reusability: একবার কাস্টম ম্যাচার তৈরি করলে তা পুনঃব্যবহারযোগ্য হয় এবং বিভিন্ন টেস্ট কেসে প্রয়োগ করা যায়।

EasyMock এ Custom Argument Matcher এর সীমাবদ্ধতা:

  1. Complexity: কাস্টম ম্যাচার তৈরি করা কিছুটা জটিল হতে পারে, বিশেষ করে যখন আর্গুমেন্টের অনেক ধরণ বা জটিল যাচাইয়ের প্রয়োজন হয়।
  2. Readability: কিছু ক্ষেত্রে, কাস্টম ম্যাচারের লজিক সঠিকভাবে বোঝা কঠিন হতে পারে, বিশেষত যখন অনেক ম্যাচার একত্রে ব্যবহার করা হয়।

সারাংশ

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

Content added By
Promotion

Are you sure to start over?

Loading...