EasyMock একটি শক্তিশালী mocking framework যা JUnit এর সাথে ব্যবহার করা হয় unit testing-এর জন্য। Argument matching এবং verification হল EasyMock এর অন্যতম গুরুত্বপূর্ণ বৈশিষ্ট্য, যা আপনাকে mock objects এর method calls পরীক্ষা এবং নিশ্চিত করতে সাহায্য করে। Advanced argument matching এর মাধ্যমে আপনি mock method calls-এর মধ্যে নির্দিষ্ট প্যারামিটারগুলির উপর আরো উন্নত নিয়ন্ত্রণ এবং যাচাই করতে পারেন, যেমন প্যারামিটার মেচিং (matching), range checking, এবং custom matching।
এই গাইডে আমরা EasyMock এর মাধ্যমে advanced argument matching এবং verification কীভাবে করা যায় তা বিস্তারিতভাবে আলোচনা করব।
1. Advanced Argument Matching
EasyMock-এ argument matching এর মাধ্যমে আপনি mock method calls-এর প্যারামিটারগুলির জন্য নির্দিষ্ট কন্ডিশন সেট করতে পারেন। এটি আপনাকে anyObject(), eq(), isA(), and(), এবং matches() এর মতো মেথড ব্যবহার করতে দেয়, যার মাধ্যমে আপনি প্যারামিটারগুলির জন্য কাস্টম matching করতে পারবেন।
1.1. Basic Argument Matching Methods
- anyObject(): এটি যে কোন অবজেক্ট মেলে এমন প্যারামিটারকে match করে।
- eq(): এটি নির্দিষ্ট মানের সাথে তুলনা করে এবং সেই মানের জন্য মেচিং করে।
- isA(): এটি নির্দিষ্ট ক্লাসের ইনস্ট্যান্সের জন্য মেচিং করে।
- matches(): এটি কাস্টম regular expression matching এর জন্য ব্যবহৃত হয়।
Example 1: anyObject()
import static org.easymock.EasyMock.*;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
public class PaymentServiceTest {
private PaymentService mockPaymentService;
@Before
public void setUp() {
mockPaymentService = createMock(PaymentService.class);
}
@Test
public void testProcessPayment_WithAnyObject() {
// Expecting any object as argument
expect(mockPaymentService.processPayment(anyObject())).andReturn(true);
// Activate mock
replay(mockPaymentService);
// Test call with any argument
boolean result = mockPaymentService.processPayment(new Object());
// Assertions
assertTrue(result);
// Verify the mock
verify(mockPaymentService);
}
}
Explanation:
- anyObject(): এখানে
processPayment()মেথডের প্যারামিটার হিসেবে any object কে match করতে বলা হয়েছে।
Example 2: eq()
@Test
public void testProcessPayment_WithSpecificArgument() {
// Expecting a specific argument (100.0)
expect(mockPaymentService.processPayment(eq(100.0))).andReturn(true);
// Activate mock
replay(mockPaymentService);
// Test call with specific argument
boolean result = mockPaymentService.processPayment(100.0);
// Assertions
assertTrue(result);
// Verify the mock
verify(mockPaymentService);
}
Explanation:
- eq():
processPayment()মেথডের জন্য 100.0 মানের সঙ্গে মেচিং করার জন্য eq() ব্যবহার করা হয়েছে। এটি নিশ্চিত করে যে এই মান ছাড়া অন্য কোন মানprocessPayment()মেথডে পাস করা যাবে না।
2. Advanced Argument Matching: Using isA() and matches()
isA() এবং matches() আরও উন্নত মেচিং প্রক্রিয়া প্রদান করে, যা টাইপ এবং কাস্টম শর্তের উপর ভিত্তি করে কাজ করে।
2.1. isA()
isA() মেথডটি দিয়ে আপনি মেচিং করতে পারেন যে প্যারামিটারটি নির্দিষ্ট ধরনের ইনস্ট্যান্স কিনা। এটি ক্লাসের টাইপ ম্যাচ করতে সহায়তা করে।
@Test
public void testProcessPayment_WithTypeMatching() {
// Expecting an instance of a specific class (e.g., Integer)
expect(mockPaymentService.processPayment(isA(Integer.class))).andReturn(true);
// Activate mock
replay(mockPaymentService);
// Test call with an instance of Integer
boolean result = mockPaymentService.processPayment(100);
// Assertions
assertTrue(result);
// Verify the mock
verify(mockPaymentService);
}
Explanation:
- isA(): এখানে processPayment() মেথডের জন্য Integer.class টাইপের প্যারামিটার মেচিং করা হয়েছে।
2.2. matches()
matches() মেথডটি কাস্টম regular expression matching এর জন্য ব্যবহৃত হয়। এটি প্যারামিটারগুলোকে বিশেষ শর্তের সাথে মেচিং করতে সহায়তা করে।
@Test
public void testProcessPayment_WithCustomRegexMatching() {
// Expecting a string that matches the regex pattern (starts with 'abc')
expect(mockPaymentService.processPayment(matches("abc.*"))).andReturn(true);
// Activate mock
replay(mockPaymentService);
// Test call with string matching regex
boolean result = mockPaymentService.processPayment("abc123");
// Assertions
assertTrue(result);
// Verify the mock
verify(mockPaymentService);
}
Explanation:
- matches(): এখানে আমরা processPayment() মেথডের প্যারামিটার হিসেবে এমন একটি string আশা করছি যা
abcদিয়ে শুরু হয় (regular expression এর মাধ্যমে)।
3. Verification with Argument Matching
EasyMock এর মাধ্যমে method calls verification এর সাথে argument matching আরও কার্যকরী হয়ে ওঠে, কারণ আপনি যে প্যারামিটারটি পাঠাচ্ছেন তা নির্দিষ্ট করতে পারবেন। verify() মেথডে argument matching নিশ্চিত করার জন্য আপনি সহজেই EasyMock এর verification এবং argument matching মেশ করতে পারেন।
Example: Verification with Argument Matching
@Test
public void testProcessPayment_WithArgumentVerification() {
// Expecting a specific argument (100.0)
expect(mockPaymentService.processPayment(eq(100.0))).andReturn(true);
// Activate mock
replay(mockPaymentService);
// Test call with specific argument
boolean result = mockPaymentService.processPayment(100.0);
// Assertions
assertTrue(result);
// Verify that the method was called with the expected argument
verify(mockPaymentService); // This will verify that eq(100.0) was matched
}
Explanation:
- Verification with Argument Matching: এখানে
verify(mockPaymentService)মেথডটি argument matching এর মাধ্যমে নিশ্চিত করে যেprocessPayment(100.0)একবার কল হয়েছে এবং প্যারামিটারটি সঠিকভাবে মেচড হয়েছে।
EasyMock-এ advanced argument matching এবং verification এর মাধ্যমে আপনি mock objects এর মেথড কলের প্যারামিটারগুলির উপর নির্দিষ্ট নিয়ন্ত্রণ এবং যাচাই করতে পারেন। আপনি anyObject(), eq(), isA(), এবং matches() এর মতো বিভিন্ন মেথড ব্যবহার করে প্যারামিটার matching করতে পারেন এবং mock method calls এর সঠিকতা যাচাই করতে verify() মেথড ব্যবহার করতে পারেন।
EasyMock এর এই ফিচারগুলি আপনাকে unit testing-এ আরো নির্ভুলভাবে mock behavior এবং প্যারামিটার মেচিং পরিচালনা করতে সহায়তা করবে, যার ফলে আপনার টেস্টগুলো আরো শক্তিশালী, কার্যকরী এবং কার্যকলাপ সুনিশ্চিত হবে।
Read more