EasyMock একটি শক্তিশালী mocking framework যা unit testing এর জন্য mock objects তৈরি করতে সাহায্য করে। যখন আপনার টেস্টে একাধিক অবজেক্টের ডিপেনডেন্সি থাকে, তখন EasyMock ব্যবহার করে আপনি সহজেই একাধিক mock তৈরি করতে এবং তাদেরকে পরিচালনা করতে পারেন। Multiple mocks তৈরি এবং ব্যবস্থাপনা করা টেস্টের কার্যকারিতা এবং পাঠযোগ্যতা বাড়ানোর জন্য গুরুত্বপূর্ণ।
এখানে, আমরা দেখব কীভাবে EasyMock ব্যবহার করে একাধিক mock অবজেক্ট তৈরি করা যায় এবং তাদের ব্যবস্থাপনা করা যায়।
Multiple Mocks তৈরি করার জন্য EasyMock ব্যবহার করা
ধরা যাক, আমাদের একটি OrderService ক্লাস রয়েছে, যা PaymentService এবং ShippingService এর উপর নির্ভরশীল। আমাদের OrderService এর কিছু মেথড টেস্ট করার জন্য PaymentService এবং ShippingService কে mock করতে হবে।
1. Interface and Class Definitions
// PaymentService interface
public interface PaymentService {
boolean processPayment(double amount);
}
// ShippingService interface
public interface ShippingService {
void shipOrder(String orderId);
}
// OrderService class which depends on PaymentService and ShippingService
public class OrderService {
private PaymentService paymentService;
private ShippingService shippingService;
public OrderService(PaymentService paymentService, ShippingService shippingService) {
this.paymentService = paymentService;
this.shippingService = shippingService;
}
public boolean placeOrder(String orderId, double amount) {
if (paymentService.processPayment(amount)) {
shippingService.shipOrder(orderId);
return true;
}
return false;
}
}
2. JUnit টেস্ট: Multiple Mocks তৈরি এবং ব্যবস্থাপনা
import static org.easymock.EasyMock.*;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
public class OrderServiceTest {
private PaymentService mockPaymentService;
private ShippingService mockShippingService;
private OrderService orderService;
@Before
public void setUp() {
// Creating multiple mocks
mockPaymentService = createMock(PaymentService.class);
mockShippingService = createMock(ShippingService.class);
// Creating the OrderService with mocked dependencies
orderService = new OrderService(mockPaymentService, mockShippingService);
}
@Test
public void testPlaceOrder_SuccessfulPayment() {
// Setting up the behavior of mocks
expect(mockPaymentService.processPayment(100.0)).andReturn(true);
mockShippingService.shipOrder("ORDER123");
// Activating mocks
replay(mockPaymentService, mockShippingService);
// Call the method to be tested
boolean result = orderService.placeOrder("ORDER123", 100.0);
// Assertions
assertTrue(result);
// Verify the behavior of mocks
verify(mockPaymentService, mockShippingService);
}
@Test
public void testPlaceOrder_FailedPayment() {
// Setting up the behavior of mocks
expect(mockPaymentService.processPayment(100.0)).andReturn(false);
// Activating mocks
replay(mockPaymentService, mockShippingService);
// Call the method to be tested
boolean result = orderService.placeOrder("ORDER123", 100.0);
// Assertions
assertFalse(result);
// Verify the behavior of mocks
verify(mockPaymentService, mockShippingService);
}
}
Explanation:
- Creating Multiple Mocks:
createMock()মেথড ব্যবহার করে আমরা দুইটি mock অবজেক্ট তৈরি করেছি:mockPaymentServiceএবংmockShippingService।- এই mocks গুলি আমাদের
OrderServiceএর constructor এ ইনজেক্ট করা হয়েছে।
- Setting Expectations:
expect()মেথড ব্যবহার করে আমরা mock objects-এর আচরণ নির্ধারণ করেছি। উদাহরণস্বরূপ, আমরাmockPaymentService.processPayment(100.0)এর জন্যtrueরিটার্ন আশা করছি, এবংmockShippingService.shipOrder("ORDER123")কল করার জন্য কোনো রিটার্ন আশা করছি না (void method)।
- Activating Mocks:
replay()মেথড ব্যবহার করে আমরা mocks-কে এক্টিভেট করেছি, যাতে তারা নির্ধারিত আচরণ অনুযায়ী কাজ করতে শুরু করে।
- Calling the Method:
orderService.placeOrder()মেথড কল করার পর, এটি mock objects এর মাধ্যমে ব্যবহৃত হবে এবং নির্ধারিত আচরণের উপর ভিত্তি করে কাজ করবে।
- Verifying Mocks:
verify()মেথড ব্যবহার করে আমরা নিশ্চিত করি যে mock objects তাদের নির্ধারিত আচরণ অনুযায়ী কাজ করেছে।
Multiple Mocks পরিচালনা করার কিছু গুরুত্বপূর্ণ পদ্ধতি:
- createMock(Class classToMock): এই মেথডটি নির্দিষ্ট ক্লাসের একটি mock অবজেক্ট তৈরি করে। একাধিক mock তৈরি করার জন্য আপনি একাধিক
createMock()কল করতে পারেন। - expect(): mock অবজেক্টের জন্য নির্দিষ্ট আচরণ সেট করে। একাধিক mock অবজেক্টের জন্য একাধিক
expect()ব্যবহার করা যেতে পারে। - replay(): এটি mock অবজেক্টগুলির আচরণ সক্রিয় করে। একাধিক mock অবজেক্টের জন্য একটি
replay()কল ব্যবহার করতে হবে। - verify(): এটি নিশ্চিত করে যে mock অবজেক্ট সঠিকভাবে ব্যবহার করা হয়েছে এবং প্রত্যাশিত আচরণ অনুসরণ করেছে। একাধিক mock অবজেক্টের জন্য
verify()কল ব্যবহার করা হয়।
ফলসী mock এবং স্টাব ব্যবহারের মধ্যে পার্থক্য:
- Mock Object: একটি mock object হল একটি object যার আচরণ সিমুলেট করা হয় এবং পরীক্ষার জন্য এর আচরণ নির্ধারণ করা হয়। আমরা verify() মেথড ব্যবহার করে নিশ্চিত করতে পারি যে এটি সঠিকভাবে কল হয়েছে।
- Stub Object: একটি stub object শুধুমাত্র নির্দিষ্ট ইনপুটের জন্য আউটপুট প্রদান করে, কিন্তু এটি পরীক্ষা করে না যে কতবার এটি কল হয়েছে। এটা মূলত পরীক্ষার জন্য নির্দিষ্ট আউটপুট বা ডেটা সরবরাহ করতে ব্যবহৃত হয়।
EasyMock এর মাধ্যমে Multiple Mocks তৈরি এবং ব্যবস্থাপনা করার সুবিধা
- Test Isolation: Multiple mocks ব্যবহারের মাধ্যমে আপনি একে অপরের থেকে স্বাধীনভাবে প্রতিটি কম্পোনেন্টের আচরণ টেস্ট করতে পারবেন, যার ফলে unit testing আরও নির্ভুল হয়।
- Cleaner and More Readable Code: Multiple mocks ব্যবহারের মাধ্যমে কোডে সরলতা আনা যায়, কারণ আপনি নির্দিষ্ট অবজেক্ট বা সার্ভিসের বাস্তবায়ন ছাড়াই শুধুমাত্র আচরণ কাস্টমাইজ করতে পারেন।
- Loosely Coupled Tests: মক অবজেক্টগুলির মাধ্যমে টেস্টগুলি কম প্যারে সম্পর্কযুক্ত হয়, যার ফলে কোড আরও নমনীয় এবং পরিবর্তনশীল হয়।
EasyMock এবং JUnit এর মাধ্যমে Multiple Mocks তৈরি এবং পরিচালনা করা অত্যন্ত কার্যকরী একটি পদ্ধতি, বিশেষ করে যখন একটি টেস্ট ক্লাসে অনেক ডিপেনডেন্সি বা অবজেক্ট থাকে। Mock objects ব্যবহার করে, আমরা বাইরের সিস্টেমের সাথে সরাসরি যোগাযোগ না করে, নির্দিষ্ট আচরণ সিমুলেট করতে পারি এবং সিস্টেমের প্রতিটি অংশ পরীক্ষা করতে পারি। এর মাধ্যমে টেস্টিং আরও সহজ, দ্রুত, এবং নির্ভুল হয়।
Read more