EasyMock হল একটি জনপ্রিয় টুল যা unit testing এ mock objects তৈরি করতে ব্যবহৃত হয়। যখন আপনি কোনো মক অবজেক্টের মেথডের জন্য একাধিক আচরণ (multiple behavior) সেট করতে চান, তখন EasyMock আপনাকে stubbing করতে সাহায্য করে, যাতে একটি মেথড বিভিন্ন ইনপুটের জন্য বিভিন্ন আউটপুট প্রদান করতে পারে।
এখানে দেখানো হবে কিভাবে EasyMock এর মাধ্যমে একাধিক আচরণ বা multiple behavior সেট করা যায়, যাতে এক মক অবজেক্টের মেথড বিভিন্ন পদ্ধতিতে কাজ করে।
1. Multiple Behavior সেট করার কৌশল
EasyMock-এ multiple behavior সেট করার জন্য, সাধারণত expect() মেথডের মাধ্যমে আপনি একটি মক অবজেক্টের জন্য একাধিক রিটার্ন ভ্যালু নির্ধারণ করতে পারেন। এটি andReturn() এবং andThrow() এর মতো চেইনিং মেথড ব্যবহার করে করা হয়।
1.1 Multiple Return Values
এটি তখন ব্যবহৃত হয় যখন একটি মক অবজেক্টের মেথড একাধিক বার কল হয় এবং প্রত্যেকবার একটি ভিন্ন আউটপুট (return value) দিতে হয়।
import static org.easymock.EasyMock.*;
public class MultipleBehaviorExample {
public static void main(String[] args) {
// Create a mock object
List<String> mockList = createMock(List.class);
// Stubbing multiple behaviors for the mock object
expect(mockList.get(0)).andReturn("First Element");
expect(mockList.get(1)).andReturn("Second Element");
expect(mockList.get(2)).andReturn("Third Element");
// Activate the mock object
replay(mockList);
// Test the mocked method calls
System.out.println("First element: " + mockList.get(0)); // Should print "First Element"
System.out.println("Second element: " + mockList.get(1)); // Should print "Second Element"
System.out.println("Third element: " + mockList.get(2)); // Should print "Third Element"
// Verify the interaction with the mock object
verify(mockList);
}
}
ব্যাখ্যা:
- expect(mockList.get(0)): এখানে প্রথম কলের জন্য "First Element" রিটার্ন হবে।
- andReturn(): একাধিক কলের জন্য আলাদা আলাদা রিটার্ন ভ্যালু নির্ধারণ করা হচ্ছে।
- replay(mockList): মক অবজেক্টে স্টাবিং চালু করা হচ্ছে, যাতে এটি টেস্টের সময় ব্যবহার করা যেতে পারে।
- verify(mockList): মক অবজেক্টের মেথড কল যাচাই করা হচ্ছে।
আউটপুট:
First element: First Element
Second element: Second Element
Third element: Third Element
2. Multiple Exceptions Throwing
EasyMock-এ আপনি একাধিক exception ফেলে দেওয়ার জন্য andThrow() ব্যবহার করতে পারেন। এটি বিশেষ করে তখন প্রয়োজন যখন আপনি কিছু নির্দিষ্ট পরিস্থিতিতে exception চান।
উদাহরণ: Multiple Exceptions Using andThrow()
import static org.easymock.EasyMock.*;
public class MultipleExceptionsExample {
public static void main(String[] args) {
// Create a mock object
List<String> mockList = createMock(List.class);
// Stubbing multiple exceptions for the mock object
expect(mockList.get(0)).andThrow(new IndexOutOfBoundsException("Index 0 is out of bounds"));
expect(mockList.get(1)).andThrow(new IllegalArgumentException("Illegal Argument for Index 1"));
// Activate the mock object
replay(mockList);
// Test the mocked method calls with exceptions
try {
mockList.get(0);
} catch (IndexOutOfBoundsException e) {
System.out.println("Caught exception: " + e.getMessage());
}
try {
mockList.get(1);
} catch (IllegalArgumentException e) {
System.out.println("Caught exception: " + e.getMessage());
}
// Verify the interaction with the mock object
verify(mockList);
}
}
ব্যাখ্যা:
- expect(mockList.get(0)): এখানে প্রথম কলের জন্য
IndexOutOfBoundsExceptionফেলা হবে। - andThrow(): দ্বিতীয় কলের জন্য
IllegalArgumentExceptionফেলা হবে। - replay(mockList): মক অবজেক্টের স্টাবিং চালু করা হচ্ছে।
- verify(mockList): মক অবজেক্টের মেথড কল যাচাই করা হচ্ছে।
আউটপুট:
Caught exception: Index 0 is out of bounds
Caught exception: Illegal Argument for Index 1
3. Multiple Behaviors with Arguments
EasyMock আপনাকে নির্দিষ্ট আর্গুমেন্টের জন্য different behavior সেট করার সুযোগও দেয়। এই ক্ষেত্রে, আপনি andReturn() বা andThrow() এর সাথে শর্ত নির্ধারণ করতে পারেন।
উদাহরণ: Different Behavior with Arguments
import static org.easymock.EasyMock.*;
public class MultipleBehaviorWithArgumentsExample {
public static void main(String[] args) {
// Create a mock object
List<String> mockList = createMock(List.class);
// Stubbing based on different arguments
expect(mockList.get(0)).andReturn("Zero Element");
expect(mockList.get(1)).andReturn("First Element");
expect(mockList.get(2)).andReturn("Second Element");
// Activate the mock object
replay(mockList);
// Test the mocked method calls with different arguments
System.out.println("Element at 0: " + mockList.get(0)); // "Zero Element"
System.out.println("Element at 1: " + mockList.get(1)); // "First Element"
System.out.println("Element at 2: " + mockList.get(2)); // "Second Element"
// Verify the interaction with the mock object
verify(mockList);
}
}
ব্যাখ্যা:
এখানে mockList.get() মেথডের জন্য বিভিন্ন আর্গুমেন্টের ভিত্তিতে আলাদা আলাদা রিটার্ন ভ্যালু নির্ধারণ করা হয়েছে। যেমন:
- get(0) মেথড কল করলে
"Zero Element"রিটার্ন করবে। - get(1) মেথড কল করলে
"First Element"রিটার্ন করবে। - get(2) মেথড কল করলে
"Second Element"রিটার্ন করবে।
আউটপুট:
Element at 0: Zero Element
Element at 1: First Element
Element at 2: Second Element
4. Chained Stubbing (Multiple Method Calls)
আপনি যদি একটি মক অবজেক্টে একাধিক মেথড কলের জন্য আচরণ স্টাব করতে চান, তবে আপনি chained stubbing ব্যবহার করতে পারেন, যেখানে এক মেথডের রিটার্ন ভ্যালু পরবর্তী মেথডের ইনপুট হিসেবে কাজ করবে।
উদাহরণ: Chained Stubbing
import static org.easymock.EasyMock.*;
public class ChainedStubbingExample {
public static void main(String[] args) {
// Create a mock object
List<String> mockList = createMock(List.class);
// Stubbing multiple methods in a chain
expect(mockList.get(0)).andReturn("First")
.andReturn("Second")
.andReturn("Third");
// Activate the mock object
replay(mockList);
// Test the mocked method calls
System.out.println("First call: " + mockList.get(0)); // "First"
System.out.println("Second call: " + mockList.get(0)); // "Second"
System.out.println("Third call: " + mockList.get(0)); // "Third"
// Verify the interaction with the mock object
verify(mockList);
}
}
ব্যাখ্যা:
এখানে mockList.get(0) মেথডটি তিনবার কল করা হয়েছে, এবং প্রতিবার ভিন্ন ভিন্ন রিটার্ন ভ্যালু স্টাব করা হয়েছে:
- প্রথম কলের জন্য
"First" - দ্বিতীয় কলের জন্য
"Second" - তৃতীয় কলের জন্য
"Third"
আউটপুট:
First call: First
Second call: Second
Third call: Third
EasyMock-এ multiple behavior সেট করার কৌশলটি আপনাকে একটি মক অবজেক্টের মেথডের জন্য একাধিক আচরণ নির্ধারণ করার ক্ষমতা প্রদান করে। এটি আপনার ইউনিট টেস্টে আরও গতিশীল এবং বাস্তবসম্মত আচরণ সিমুলেট করতে সহায়ক। আপনি multiple return values, multiple exceptions, chained stubbing এবং arguments-based behavior সহ সহজেই মক অবজেক্ট তৈরি এবং পরিচালনা করতে পারেন, যা টেস্টিং প্রক্রিয়াকে আরও কার্যকর এবং রক্ষণাবেক্ষণযোগ্য করে তোলে।
Read more