Delegation একটি গুরুত্বপূর্ণ ধারণা যেখানে এক অবজেক্ট তার আচরণ অন্য অবজেক্টে হস্তান্তর (delegate) করে। EasyMock ব্যবহার করে, আপনি delegation এর মাধ্যমে complex logic সহজে সিমুলেট করতে পারেন এবং ইউনিট টেস্টে ব্যবহার করতে পারেন। এটা বিশেষভাবে উপকারী যখন আপনার কোডের কোন অংশ নির্ভরশীল বা জটিল লজিকের মধ্যে ডিপেন্ডেন্ট থাকে এবং আপনি সেই লজিককে মক করে পরীক্ষা করতে চান।
Delegation ব্যবহার করে, আপনি মূল কোডের কিছু কাজ অন্য অবজেক্টকে দান করতে পারেন এবং তারপর সেই অবজেক্টের আচরণ মক করে টেস্টিং করতে পারেন।
Delegation কি?
Delegation হল এমন একটি পদ্ধতি যেখানে একটি অবজেক্টের কাজ অন্য অবজেক্টের মাধ্যমে সম্পন্ন করা হয়। এটি সাধারণত নিম্নলিখিত পরিস্থিতিতে ব্যবহৃত হয়:
- যখন একটি অবজেক্টের আচরণ আরেকটি অবজেক্টের উপর নির্ভরশীল।
- যখন একটি ক্লাস তার নিজস্ব কাজের বাইরে একটি নির্দিষ্ট কাজ অন্য ক্লাসকে দান করে।
EasyMock এর মাধ্যমে Delegation এর প্রয়োগ
যেমন, ধরুন একটি PaymentService ক্লাস রয়েছে, যা PaymentGateway ক্লাসের মাধ্যমে পেমেন্ট প্রসেস করতে হবে। কিন্তু এই পেমেন্ট প্রসেসিং লজিক জটিল হতে পারে, তাই আমরা PaymentService ক্লাসে delegation ব্যবহার করে এই লজিক অন্য ক্লাসে হস্তান্তর করব এবং তারপর সেই ক্লাসের আচরণ মক করব।
ধাপসমূহ:
- Delegation: কোডে অন্য অবজেক্টকে দায়িত্ব দেওয়া, যেখানে একটি ক্লাস আরেকটি ক্লাসের মেথড কল করে।
- EasyMock: মক অবজেক্ট তৈরি করা এবং তার উপর নির্দিষ্ট আচরণ সেট করা।
- Complex Logic: মক অবজেক্টের মাধ্যমে জটিল লজিকের আচরণ সিমুলেট করা।
উদাহরণ: Delegation এর মাধ্যমে Complex Logic বাস্তবায়ন করা
ধরা যাক, আমাদের PaymentService ক্লাসে একটি জটিল পেমেন্ট প্রসেসিং লজিক রয়েছে যা PaymentGateway ক্লাসে delegation করা হয়েছে। আমরা EasyMock ব্যবহার করে PaymentGateway ক্লাসের মক অবজেক্ট তৈরি করব এবং processPayment() মেথডের জন্য একটি কাস্টম আচরণ সংজ্ঞায়িত করব।
১. PaymentGateway ক্লাস (Complex Logic)
public class PaymentGateway {
public boolean processPayment(int amount) {
// Complex logic (e.g., connecting to third-party payment gateway)
if (amount > 1000) {
// Simulate complex logic for large payments
return true; // Assume large payments are successful
} else {
// Simulate simple payments handling
return false;
}
}
}
২. PaymentService ক্লাস (Delegation)
public class PaymentService {
private PaymentGateway paymentGateway;
public PaymentService(PaymentGateway paymentGateway) {
this.paymentGateway = paymentGateway;
}
public String makePayment(int amount) {
boolean isPaymentSuccessful = paymentGateway.processPayment(amount);
if (isPaymentSuccessful) {
return "Payment successful";
} else {
return "Payment failed";
}
}
}
৩. EasyMock এর মাধ্যমে Unit Test with Delegation
import static org.easymock.EasyMock.*;
import org.junit.Test;
import static org.junit.Assert.*;
public class PaymentServiceTest {
@Test
public void testMakePaymentWithDelegation() {
// Create a mock object for PaymentGateway
PaymentGateway mockPaymentGateway = createMock(PaymentGateway.class);
// Set up the expectation: when processPayment is called with 2000, return true
expect(mockPaymentGateway.processPayment(2000)).andReturn(true);
replay(mockPaymentGateway);
// Create PaymentService with the mock PaymentGateway
PaymentService paymentService = new PaymentService(mockPaymentGateway);
// Call the method under test with 2000 as payment amount
String result = paymentService.makePayment(2000);
// Assert that the payment was successful
assertEquals("Payment successful", result);
// Verify the behavior of the mock object
verify(mockPaymentGateway);
}
@Test
public void testMakePaymentWithFailure() {
// Create a mock object for PaymentGateway
PaymentGateway mockPaymentGateway = createMock(PaymentGateway.class);
// Set up the expectation: when processPayment is called with 500, return false
expect(mockPaymentGateway.processPayment(500)).andReturn(false);
replay(mockPaymentGateway);
// Create PaymentService with the mock PaymentGateway
PaymentService paymentService = new PaymentService(mockPaymentGateway);
// Call the method under test with 500 as payment amount
String result = paymentService.makePayment(500);
// Assert that the payment failed
assertEquals("Payment failed", result);
// Verify the behavior of the mock object
verify(mockPaymentGateway);
}
}
ব্যাখ্যা:
- Delegation: PaymentService ক্লাসের
makePayment()মেথডটি PaymentGateway ক্লাসেরprocessPayment()মেথডের ওপর নির্ভরশীল। এইভাবে, PaymentServiceprocessPayment()মেথডের জন্য একটি delegation তৈরি করেছে। - EasyMock: আমরা
createMock(PaymentGateway.class)মেথড ব্যবহার করে PaymentGateway ক্লাসের একটি মক অবজেক্ট তৈরি করেছি এবং তার জন্য একটি প্রত্যাশা (expectation) সেট করেছি। এখানে আমরাprocessPayment()মেথডের জন্য ২০০০ টাকা দিয়ে সফল পেমেন্ট এবং ৫০০ টাকা দিয়ে ব্যর্থ পেমেন্ট পরীক্ষা করেছি। - Testing Complex Logic: PaymentGateway ক্লাসের জটিল লজিক যেমন, বড় পরিমাণের পেমেন্ট সফল হওয়া এবং ছোট পরিমাণের পেমেন্ট ব্যর্থ হওয়া সিমুলেট করা হয়েছে।
Test Case 1 (Successful Payment):
- Input: ২০০০ টাকা
- Expected Output:
"Payment successful" - Explanation: PaymentGateway এর
processPayment()মেথডে ২০০০ টাকা দিলে true ফেরত এসেছে, তাই পেমেন্ট সফল।
Test Case 2 (Failed Payment):
- Input: ৫০০ টাকা
- Expected Output:
"Payment failed" - Explanation: PaymentGateway এর
processPayment()মেথডে ৫০০ টাকা দিলে false ফেরত এসেছে, তাই পেমেন্ট ব্যর্থ।
EasyMock দিয়ে Delegation এর মাধ্যমে Complex Logic বাস্তবায়ন করার সুবিধা:
- Simplifies Testing: আপনি বাইরের নির্ভরশীলতা বা জটিল লজিককে মক করে শুধুমাত্র আপনার কোডের গুরুত্বপূর্ণ অংশ পরীক্ষা করতে পারেন।
- Isolation: Delegation এর মাধ্যমে আপনি কোডের বিভিন্ন অংশকে আলাদা রাখতে পারেন এবং সেগুলির মধ্যে সংযোগ বিচ্ছিন্ন করতে পারেন, যা টেস্টিংকে সহজ করে তোলে।
- Behavior Testing: মক অবজেক্টের মাধ্যমে আপনি complex behaviors সিমুলেট করতে পারেন এবং যাচাই করতে পারেন যে আপনার কোড সঠিকভাবে কাজ করছে কিনা।
সীমাবদ্ধতা:
- Increased Complexity: কখনো কখনো, মকিংয়ের জন্য জটিল লজিক এবং কনফিগারেশন প্রয়োজন হতে পারে, যা কোডের জটিলতা বৃদ্ধি করে।
- Not Suitable for All Scenarios: কিছু পরিস্থিতিতে partial mocking বা delegation প্রয়োগ করা কঠিন হতে পারে এবং কোডের কাঠামো বুঝতে সমস্যা হতে পারে।
সারাংশ
EasyMock এর মাধ্যমে delegation ব্যবহার করে আপনি আপনার কোডের জটিল লজিক মক করতে পারেন এবং ইউনিট টেস্টে সহজে পরীক্ষণ করতে পারেন। PaymentGateway এর মত বাইরের নির্ভরশীল ক্লাসের জটিল লজিককে EasyMock দিয়ে সিমুলেট করে, আপনি আপনার কোডের কার্যকারিতা পরীক্ষা করতে সক্ষম হন। Partial Mocking এবং delegation এর সংমিশ্রণে আপনি কোডের নির্দিষ্ট অংশের আচরণ সহজেই পরীক্ষণ করতে পারেন।
Read more