EasyMock ব্যবহার করে মক অবজেক্ট তৈরি করার সময়, কখনো কখনো আমাদের exception handling বা error conditions মক করতে হতে পারে। যেমন, একটি মেথড যখন কোনো নির্দিষ্ট শর্তে ব্যতিক্রম (exception) ছুঁড়ে দেয়, তখন আমাদের এই আচরণটি টেস্টের মধ্যে সিমুলেট করা প্রয়োজন।
EasyMock এ exception handling টেস্ট করতে আমরা expect() মেথড ব্যবহার করতে পারি, যেখানে আমরা andThrow() মেথডের সাহায্যে কোনো exception "throw" করতে নির্দেশনা দিতে পারি।
এই গাইডে, আমরা EasyMock দিয়ে exception handling এর জন্য মক সেটআপ কিভাবে করা যায়, তা দেখবো।
1. EasyMock দিয়ে Exception Handling Setup
1.1 Exception Handling Setup
আমরা EasyMock এ একটি মক অবজেক্ট সেটআপ করতে পারি, যাতে যখন কোনো নির্দিষ্ট মেথড কল করা হয়, তখন একটি exception ঘটানো হয়। এই কাজটি andThrow() মেথডের মাধ্যমে করা হয়।
1.2 এখানে একটি উদাহরণ দেওয়া হল:
ধরা যাক, আমাদের একটি PaymentService ইন্টারফেস আছে এবং একটি PaymentProcessor ক্লাস রয়েছে। আমরা টেস্ট করতে চাই যে, যদি PaymentService কোনো ব্যতিক্রম (exception) ছুঁড়ে দেয়, তাহলে PaymentProcessor ক্লাস সঠিকভাবে তার এক্সপশনের প্রতি প্রতিক্রিয়া দেখায় কিনা।
import org.easymock.EasyMock;
import org.junit.Test;
import static org.easymock.EasyMock.*;
public class EasyMockExceptionHandlingExample {
// PaymentService Interface
public interface PaymentService {
void processPayment(double amount) throws PaymentException;
}
// Custom Exception
public static class PaymentException extends Exception {
public PaymentException(String message) {
super(message);
}
}
// PaymentProcessor Class that depends on PaymentService
public class PaymentProcessor {
private PaymentService paymentService;
public PaymentProcessor(PaymentService paymentService) {
this.paymentService = paymentService;
}
public String processTransaction(double amount) {
try {
paymentService.processPayment(amount);
return "Payment Successful";
} catch (PaymentException e) {
return "Payment Failed: " + e.getMessage();
}
}
}
@Test
public void testPaymentExceptionHandling() {
// Create a mock for PaymentService
PaymentService mockPaymentService = createMock(PaymentService.class);
// Define the behavior of the mock to throw PaymentException
try {
mockPaymentService.processPayment(1000.0);
expectLastCall().andThrow(new PaymentException("Insufficient Funds"));
} catch (PaymentException e) {
e.printStackTrace();
}
// Activate the mock
replay(mockPaymentService);
// Create the object under test
PaymentProcessor paymentProcessor = new PaymentProcessor(mockPaymentService);
// Call the method under test
String result = paymentProcessor.processTransaction(1000.0);
System.out.println(result); // Expected output: Payment Failed: Insufficient Funds
// Verify the interaction with the mock
verify(mockPaymentService);
}
}
ব্যাখ্যা:
- PaymentService Interface: একটি সিম্পল ইন্টারফেস যা
processPayment()মেথড প্রদান করে, যা একটি PaymentException ছুঁড়ে দেয় যদি কোনো সমস্যা ঘটে। - PaymentProcessor Class: এটি PaymentService এর উপর নির্ভরশীল এবং তার
processTransaction()মেথডে try-catch ব্লক ব্যবহার করে ব্যতিক্রম পরিচালনা করে। - EasyMock Setup:
- expect() ব্যবহার করে, আমরা
processPayment()মেথডের জন্য একটি exception (PaymentException) নির্ধারণ করেছি। - andThrow() মেথড ব্যবহার করে ব্যতিক্রম ছুঁড়তে নির্দেশ দিয়েছি।
- replay() মেথড দ্বারা মক অবজেক্টটি সক্রিয় করা হয়েছে এবং টেস্ট করা হয়েছে যে
PaymentProcessorক্লাস সঠিকভাবে ব্যতিক্রম পরিচালনা করছে।
- expect() ব্যবহার করে, আমরা
- Verify: verify() মেথড ব্যবহার করে নিশ্চিত হয়েছি যে PaymentService এর processPayment() মেথডটি সঠিকভাবে কল হয়েছে।
2. Different Ways to Handle Exceptions in EasyMock
2.1 andThrow() with Multiple Exceptions
কখনো কখনো আপনি একই মেথডের জন্য বিভিন্ন শর্তে বিভিন্ন ধরনের ব্যতিক্রম ছুঁড়তে চাইবেন। EasyMock এ আপনি andThrow() ব্যবহার করে একাধিক ব্যতিক্রমও ছুঁড়তে পারেন।
Example:
mockPaymentService.processPayment(500.0);
expectLastCall().andThrow(new PaymentException("Insufficient Funds"));
mockPaymentService.processPayment(1500.0);
expectLastCall().andThrow(new PaymentException("Card Expired"));
এখানে, আপনি দুটি ভিন্ন শর্তের জন্য দুটি ভিন্ন ব্যতিক্রম সিমুলেট করছেন।
2.2 Throwing Exceptions Based on Argument Matching
আপনি Argument Matchers ব্যবহার করে নির্দিষ্ট আর্গুমেন্টের ভিত্তিতে ব্যতিক্রমও ছুঁড়তে পারেন।
Example:
mockPaymentService.processPayment(eq(500.0));
expectLastCall().andThrow(new PaymentException("Insufficient Funds"));
mockPaymentService.processPayment(eq(1000.0));
expectLastCall().andThrow(new PaymentException("Card Expired"));
এখানে, নির্দিষ্ট আর্গুমেন্টের উপর ভিত্তি করে ব্যতিক্রম ছুঁড়া হচ্ছে। যখন আর্গুমেন্ট 500.0 হবে, তখন Insufficient Funds ব্যতিক্রম ছুঁড়বে, এবং 1000.0 হলে Card Expired ব্যতিক্রম ছুঁড়বে।
3. Verification of Exception Handling in EasyMock
Verifying Method Calls with Exception Handling
EasyMock এ আপনি যাচাই করতে পারেন যে কোনো মেথড কল করার সময় ব্যতিক্রম (exception) সঠিকভাবে ছুঁড়ছে কিনা। এটি verify() মেথডের মাধ্যমে করা হয়।
Example:
mockPaymentService.processPayment(1000.0);
expectLastCall().andThrow(new PaymentException("Insufficient Funds"));
replay(mockPaymentService);
// Call the method
paymentProcessor.processTransaction(1000.0);
// Verify that the method was called and the exception was thrown
verify(mockPaymentService); // This ensures processPayment was called and the exception was thrown correctly
এখানে, verify() মেথড ব্যবহার করে নিশ্চিত করা হচ্ছে যে, processPayment() মেথডটি ঠিকমতো কল হয়েছে এবং ব্যতিক্রম সঠিকভাবে ছুঁড়েছে।
EasyMock ব্যতিক্রম (exceptions) মক করার ক্ষেত্রে খুবই কার্যকরী একটি টুল। আপনি andThrow() মেথড ব্যবহার করে মক অবজেক্টে বিভিন্ন ধরনের ব্যতিক্রম সিমুলেট করতে পারেন এবং টেস্টের মধ্যে exception handling সঠিকভাবে যাচাই করতে পারেন। এটি সফটওয়্যার টেস্টিংয়ে খুবই সহায়ক হতে পারে, কারণ আপনার কোডে exception handling এর কার্যকারিতা সঠিকভাবে পরীক্ষা করা সম্ভব হয়।
এই কৌশলটি বিভিন্ন পরিস্থিতিতে ব্যবহৃত হতে পারে, যেমন:
- Network Failures
- Database Errors
- Third-party Service Failures
এইভাবে আপনি নিশ্চিত করতে পারবেন যে, আপনার কোড সঠিকভাবে ব্যতিক্রম পরিচালনা করছে এবং প্রত্যাশিত আচরণ প্রদর্শন করছে।
Read more