Chained Method Calls Mocking হল একটি গুরুত্বপূর্ণ কৌশল যখন আপনার কোনো মক অবজেক্টের মেথডগুলো একে অপরের উপর ভিত্তি করে কল হয়। উদাহরণস্বরূপ, একটি মেথড একটি ভ্যালু রিটার্ন করে, যা অন্য একটি মেথডের আর্গুমেন্ট হিসেবে ব্যবহৃত হয়। এই ধরনের পরিস্থিতিতে EasyMock এর মাধ্যমে মক অবজেক্টের চেইনড মেথড কল সিমুলেট করা যায়।
EasyMock এ চেইনড মেথড কল মক করার জন্য আমরা expect(), andReturn() এবং replay() মেথডের মাধ্যমে একাধিক মেথডের প্রত্যাশিত আচরণ নির্ধারণ করতে পারি।
1. Chained Method Calls Mocking এর ধারণা
চেইনড মেথড কল এমন একটি কৌশল যেখানে একাধিক মেথড একে অপরের উপর নির্ভরশীল হয়ে কল হয়। একটি মেথড অন্য মেথডের আউটপুটকে আর্গুমেন্ট হিসেবে ব্যবহার করে। EasyMock এ আপনি এই ধরনের মেথডগুলোর আচরণ সিমুলেট করতে পারেন।
চেইনড মেথড কলের উদাহরণ: ধরা যাক, একটি User ক্লাস রয়েছে, যেখানে getAddress() মেথডটি getStreet() মেথড কল করে, এবং getStreet() আবার একটি String রিটার্ন করে। এখানে, আপনি যদি চেইনড মেথড কল মক করতে চান, তাহলে প্রতিটি মেথডের জন্য expect() এবং andReturn() ব্যবহার করবেন।
2. EasyMock দিয়ে Chained Method Calls Mocking
ধরা যাক, আমাদের একটি UserService ক্লাস রয়েছে, যেখানে getUser() মেথড একটি User অবজেক্ট রিটার্ন করে, এবং User অবজেক্টের getAddress() মেথড আবার Address অবজেক্ট রিটার্ন করে, যা getStreet() মেথড কল করে।
Step-by-step Example:
import org.easymock.EasyMock;
import org.junit.Test;
import static org.easymock.EasyMock.*;
public class EasyMockChainedMethodTest {
// User class with chained methods
public class User {
public Address getAddress() {
return new Address();
}
}
public class Address {
public String getStreet() {
return "123 Main St";
}
}
public interface UserService {
User getUser(int userId);
}
@Test
public void testChainedMethodCalls() {
// Create mock object for UserService and Address
UserService mockUserService = createMock(UserService.class);
User mockUser = createMock(User.class);
Address mockAddress = createMock(Address.class);
// Setting up the expected behavior for chained method calls
expect(mockUserService.getUser(1)).andReturn(mockUser);
expect(mockUser.getAddress()).andReturn(mockAddress);
expect(mockAddress.getStreet()).andReturn("123 Main St");
// Activate the mocks
replay(mockUserService, mockUser, mockAddress);
// Test the chained method calls
String street = mockUserService.getUser(1).getAddress().getStreet();
System.out.println("Street: " + street); // Should print: Street: 123 Main St
// Verify that all expected methods were called
verify(mockUserService, mockUser, mockAddress);
}
}
ব্যাখ্যা:
- Mock Object Creation:
UserService,User, এবংAddressক্লাসের জন্য মক অবজেক্ট তৈরি করা হয়েছে।
- Setting Up Expectations:
expect(mockUserService.getUser(1)).andReturn(mockUser)দ্বারা প্রথম মেথডের প্রত্যাশা সেট করা হয়েছে।- এরপর,
expect(mockUser.getAddress()).andReturn(mockAddress)এবংexpect(mockAddress.getStreet()).andReturn("123 Main St")এর মাধ্যমে চেইনড মেথড কলের প্রত্যাশা সেট করা হয়েছে।
- Replay Phase:
replay(mockUserService, mockUser, mockAddress)এর মাধ্যমে মক অবজেক্ট সক্রিয় করা হয়েছে, যাতে টেস্টের সময় মেথড কলের আচরণ সঠিকভাবে প্রদর্শিত হয়।
- Test Execution:
mockUserService.getUser(1).getAddress().getStreet()এই চেইনড মেথড কলটি টেস্ট করা হয়েছে এবং প্রত্যাশিত রিটার্ন ভ্যালু"123 Main St"আসবে।
- Verification Phase:
verify(mockUserService, mockUser, mockAddress)দ্বারা আমরা নিশ্চিত হয়েছি যে সমস্ত মেথড কল সঠিকভাবে হয়েছে এবং প্রত্যাশিত আচরণ অনুযায়ী কাজ করেছে।
3. Chained Method Calls Mocking এর সুবিধা
3.1 Realistic Testing:
চেইনড মেথড কল মক করার মাধ্যমে আপনি বাস্তব জীবনের পরিস্থিতি সিমুলেট করতে পারেন, যেখানে একাধিক মেথড একে অপরের উপর নির্ভরশীল থাকে।
3.2 Test Isolation:
এটি unit testing এর একটি বড় সুবিধা, কারণ আপনি বাইরের সিস্টেম বা ডিপেনডেন্সির পরিবর্তে মক অবজেক্ট ব্যবহার করে কোডের নির্দিষ্ট লজিক টেস্ট করতে পারেন।
3.3 Flexible and Scalable:
চেইনড মেথড কলের মাধ্যমে আপনি বিভিন্ন লজিক পরীক্ষা করতে পারেন এবং সহজেই নতুন মেথডের সাথে টেস্ট কেস এক্সটেন্ড করতে পারেন।
4. Additional Considerations
4.1 Multiple Return Values in Chained Calls
কখনো কখনো, আপনি চেইনড মেথড কলের জন্য একাধিক ভ্যালু রিটার্ন করতে পারেন। আপনি andReturn() মেথডের মাধ্যমে বিভিন্ন রিটার্ন ভ্যালু সিলেক্ট করতে পারেন।
Example:
expect(mockUserService.getUser(1)).andReturn(mockUser);
expect(mockUser.getAddress()).andReturn(mockAddress).andReturn(null); // Multiple returns for chained call
expect(mockAddress.getStreet()).andReturn("123 Main St").andReturn("456 Elm St");
4.2 Verifying Method Call Order
EasyMock আপনাকে মেথড কলের অর্ডার যাচাই করতে সাহায্য করে, যা চেইনড মেথড কলের ক্ষেত্রে উপকারী হতে পারে।
Example:
mockUserService.getUser(1);
mockUser.getAddress();
expectLastCall().after(mockUserService.getUser(1)); // Verify the order of method calls
Chained Method Calls Mocking হল EasyMock এ একটি শক্তিশালী কৌশল যা একাধিক মেথডের আচরণ সিমুলেট করতে ব্যবহৃত হয়, যেখানে এক মেথডের রিটার্ন ভ্যালু অন্য মেথডের আর্গুমেন্ট হিসেবে ব্যবহৃত হয়। এটি unit testing কে আরও বাস্তবসম্মত এবং নমনীয় করে তোলে, এবং কোডের নির্দিষ্ট অংশের লজিককে সঠিকভাবে পরীক্ষা করতে সাহায্য করে।
EasyMock এর মাধ্যমে চেইনড মেথড কল মক করা সহজ এবং কার্যকর, এবং এটি আপনাকে বিভিন্ন ধরনের ইউনিট টেস্টিংয়ের সুযোগ প্রদান করে, যা সফটওয়্যার ডেভেলপমেন্ট এবং রক্ষণাবেক্ষণে সহায়ক হতে পারে।
Read more