EasyMock একটি শক্তিশালী mocking framework যা unit testing তে ব্যবহৃত হয়। Exception handling গুরুত্বপূর্ণ অংশ যা সফটওয়্যার টেস্টিংয়ের সময় বিশেষ মনোযোগ দাবি করে। Checked এবং Unchecked exceptions এর জন্য EasyMock ব্যবহার করার সময় আমাদের কিছু নির্দিষ্ট কৌশল অবলম্বন করতে হয়।
Checked exceptions হল সেই এক্সেপশনগুলি যেগুলি compile-time তে checked করা হয়, অর্থাৎ, কোডে তাদের সঠিকভাবে হ্যান্ডেল করতে হবে। অন্যদিকে, Unchecked exceptions হল runtime exceptions, যা স্বাভাবিকভাবে runtime তে ঘটে এবং হ্যান্ডেল করার জন্য বাধ্যতামূলক নয়।
এখানে আমরা দেখব কিভাবে EasyMock ব্যবহার করে Checked এবং Unchecked exceptions মক এবং হ্যান্ডেল করা যায়।
1. Unchecked Exceptions Handling with EasyMock
Unchecked exceptions (যেমন NullPointerException, ArrayIndexOutOfBoundsException) সোজা ও সহজভাবে মক করা যায় কারণ এগুলি runtime এ ঘটে এবং আমরা সেগুলি মক অবজেক্টের মাধ্যমে সহজেই নির্দিষ্ট আচরণ দিতে পারি।
1.1. Unchecked Exception Example in EasyMock
ধরা যাক আমাদের একটি PaymentService ক্লাস আছে, যেখানে একটি unchecked exception (IllegalArgumentException) থ্রো করা হচ্ছে যদি কোনো ভুল পরিমাণ প্রদান করা হয়।
import org.easymock.EasyMock;
import org.junit.Test;
import static org.junit.Assert.*;
class PaymentService {
public void processPayment(int amount) {
if (amount < 0) {
throw new IllegalArgumentException("Amount cannot be negative");
}
System.out.println("Payment of " + amount + " processed.");
}
}
public class UncheckedExceptionHandlingExample {
@Test(expected = IllegalArgumentException.class)
public void testProcessPaymentWithException() {
// Create the mock object
PaymentService paymentServiceMock = EasyMock.createMock(PaymentService.class);
// Define the behavior to throw IllegalArgumentException when negative amount is passed
paymentServiceMock.processPayment(-100);
EasyMock.expectLastCall().andThrow(new IllegalArgumentException("Amount cannot be negative"));
// Activate the mock
EasyMock.replay(paymentServiceMock);
// Calling the method which should throw the exception
paymentServiceMock.processPayment(-100);
// Verify the mock interactions
EasyMock.verify(paymentServiceMock);
}
}
ব্যাখ্যা:
- PaymentService ক্লাসে processPayment() মেথডে IllegalArgumentException থ্রো করা হয়েছে যখন পরিমাণ নেতিবাচক হয়।
- EasyMock.expectLastCall().andThrow() এর মাধ্যমে মক অবজেক্টের জন্য unchecked exception থ্রো করার আচরণ নির্ধারণ করা হয়েছে।
- @Test(expected = IllegalArgumentException.class) অ্যানোটেশনটি পরীক্ষা করছে যে, যদি processPayment(-100) কল করা হয় তবে IllegalArgumentException থ্রো হয়।
আউটপুট:
java.lang.IllegalArgumentException: Amount cannot be negative
2. Checked Exceptions Handling with EasyMock
Checked exceptions হল এক্সেপশনগুলি যেগুলি compile-time তে চেক করা হয়, এবং এদেরকে সঠিকভাবে হ্যান্ডেল করতে হয়। EasyMock এ, আপনি checked exceptions মক করার সময় andThrow() মেথড ব্যবহার করতে পারেন, কিন্তু আপনাকে অবশ্যই সেগুলিকে throws হিসেবে ঘোষণা করতে হবে।
2.1. Checked Exception Example in EasyMock
ধরা যাক, আমাদের একটি DatabaseService ক্লাস আছে, যেখানে একটি checked exception (SQLException) থ্রো করা হচ্ছে যদি ডাটাবেস সংযোগে কোনো সমস্যা হয়।
import org.easymock.EasyMock;
import org.junit.Test;
import static org.junit.Assert.*;
import java.sql.SQLException;
class DatabaseService {
public void connectToDatabase() throws SQLException {
// Simulate database connection logic
throw new SQLException("Unable to connect to the database");
}
}
public class CheckedExceptionHandlingExample {
@Test(expected = SQLException.class)
public void testDatabaseConnectionWithException() throws SQLException {
// Create mock object
DatabaseService databaseServiceMock = EasyMock.createMock(DatabaseService.class);
// Define the behavior to throw SQLException
databaseServiceMock.connectToDatabase();
EasyMock.expectLastCall().andThrow(new SQLException("Unable to connect to the database"));
// Activate the mock
EasyMock.replay(databaseServiceMock);
// Calling the method which should throw SQLException
databaseServiceMock.connectToDatabase();
// Verify the mock interactions
EasyMock.verify(databaseServiceMock);
}
}
ব্যাখ্যা:
- DatabaseService ক্লাসে connectToDatabase() মেথডে SQLException থ্রো করা হচ্ছে।
- EasyMock.expectLastCall().andThrow() এর মাধ্যমে SQLException এর আচরণ নির্ধারণ করা হয়েছে।
- @Test(expected = SQLException.class) অ্যানোটেশনটি নিশ্চিত করে যে, যখন connectToDatabase() মেথড কল করা হয়, তখন SQLException থ্রো হয়।
আউটপুট:
java.sql.SQLException: Unable to connect to the database
3. Mocking Checked and Unchecked Exceptions Together
ধরা যাক, আমাদের একটি PaymentService এবং একটি DatabaseService আছে, এবং দুটি ক্লাসের মেথডই এক্সেপশন থ্রো করতে পারে। এখানে আমরা checked এবং unchecked এক্সেপশন একসাথে মক করব।
import org.easymock.EasyMock;
import org.junit.Test;
import static org.junit.Assert.*;
import java.sql.SQLException;
class PaymentService {
private DatabaseService databaseService;
public PaymentService(DatabaseService databaseService) {
this.databaseService = databaseService;
}
public void makePayment(int amount) throws SQLException {
if (amount < 0) {
throw new IllegalArgumentException("Amount cannot be negative");
}
databaseService.connectToDatabase();
System.out.println("Payment of " + amount + " processed.");
}
}
class DatabaseService {
public void connectToDatabase() throws SQLException {
// Simulate database connection logic
throw new SQLException("Unable to connect to the database");
}
}
public class CombinedExceptionHandlingExample {
@Test(expected = SQLException.class)
public void testMakePaymentWithCheckedAndUncheckedExceptions() throws SQLException {
// Create mock objects
DatabaseService databaseServiceMock = EasyMock.createMock(DatabaseService.class);
PaymentService paymentServiceMock = EasyMock.createMock(PaymentService.class);
// Define the behavior for the mock objects
databaseServiceMock.connectToDatabase();
EasyMock.expectLastCall().andThrow(new SQLException("Unable to connect to the database"));
paymentServiceMock.makePayment(-100); // Expect IllegalArgumentException
EasyMock.expectLastCall().andThrow(new IllegalArgumentException("Amount cannot be negative"));
// Activate the mocks
EasyMock.replay(databaseServiceMock, paymentServiceMock);
// Test the exceptions
paymentServiceMock.makePayment(-100); // This should throw IllegalArgumentException
databaseServiceMock.connectToDatabase(); // This should throw SQLException
// Verify the mocks
EasyMock.verify(databaseServiceMock, paymentServiceMock);
}
}
ব্যাখ্যা:
- এখানে PaymentService মেথডে IllegalArgumentException (unchecked) এবং SQLException (checked) উভয়ই মক করা হয়েছে।
- EasyMock.expectLastCall().andThrow() ব্যবহার করে একাধিক এক্সেপশন থ্রো করার জন্য সেট করা হয়েছে।
- @Test(expected = SQLException.class) অ্যানোটেশনটি SQLException এর জন্য একটি ভ্যালিডেশন যুক্ত করেছে।
4. Summary
- Unchecked Exceptions (যেমন
IllegalArgumentException,NullPointerException) মক করা সহজ কারণ এগুলি runtime exceptions, এবং আমরা EasyMock এর মাধ্যমে সেগুলিকে সহজেই থ্রো করতে পারি। - Checked Exceptions (যেমন
SQLException,IOException) এর জন্য EasyMock ব্যবহারে কিছু অতিরিক্ত ধাপ থাকতে পারে। আমরা throws ডিক্লারেশন সহ andThrow() ব্যবহার করে checked exceptions মক করতে পারি। - EasyMock আমাদের mocking সিস্টেমে এধরনের এক্সেপশনগুলির আচরণ কন্ট্রোল করতে সাহায্য করে, যার ফলে unit testing আরও নির্ভুল এবং কার্যকর হয়।
এভাবে, EasyMock ব্যবহার করে আপনি আপনার কোডের checked এবং unchecked exceptions সঠিকভাবে হ্যান্ডেল করতে পারবেন এবং এক্সেপশনগুলির উপর ভিত্তি করে আপনার টেস্টগুলি চালাতে পারবেন।
Read more