EasyMock হল একটি শক্তিশালী mocking framework যা Java টেস্টিংয়ের জন্য ব্যবহৃত হয়। এটি আপনাকে interface এবং class উভয়ের জন্য মক অবজেক্ট তৈরি করতে সাহায্য করে। মক অবজেক্টগুলি টেস্টিংয়ের সময় নির্ভরশীলতার আচরণ নকল (mock) করতে ব্যবহৃত হয়, যাতে আসল অবজেক্ট ব্যবহার না করে নির্দিষ্ট লজিক পরীক্ষা করা যায়।
এখানে আমরা দেখবো EasyMock ব্যবহার করে Interface এবং Class উভয়ের জন্য মক অবজেক্ট কীভাবে তৈরি করা যায়।
1. Interface এর জন্য Mock তৈরি
Interface এর জন্য মক তৈরি করার সময়, EasyMock createMock() মেথড ব্যবহার করে মক অবজেক্ট তৈরি করে। এই পদ্ধতিতে, মক অবজেক্টটি শুধু interface অনুযায়ী আচরণ করে, এবং আসল ক্লাসের কোনও বাস্তবায়ন প্রয়োজন হয় না।
1.1. Interface Mock Example
ধরা যাক আমাদের একটি PaymentService ইন্টারফেস রয়েছে, এবং আমরা এটি মক করতে চাই।
import org.easymock.EasyMock;
import org.junit.Test;
import static org.junit.Assert.*;
interface PaymentService {
boolean processPayment(int amount);
}
// Test Class
public class InterfaceMockExample {
@Test
public void testProcessPayment() {
// Creating mock object for the interface
PaymentService paymentServiceMock = EasyMock.createMock(PaymentService.class);
// Defining behavior for the mock
EasyMock.expect(paymentServiceMock.processPayment(100)).andReturn(true);
// Activating the mock
EasyMock.replay(paymentServiceMock);
// Using the mock object
boolean paymentStatus = paymentServiceMock.processPayment(100);
// Asserting the result
assertTrue(paymentStatus);
// Verifying the mock interactions
EasyMock.verify(paymentServiceMock);
}
}
ব্যাখ্যা:
- PaymentService একটি সিম্পল ইন্টারফেস যা একটি পেমেন্ট প্রক্রিয়া করার জন্য একটি processPayment() মেথড ঘোষণা করে।
- EasyMock.createMock(PaymentService.class) এর মাধ্যমে আমরা ইন্টারফেসটির জন্য একটি মক অবজেক্ট তৈরি করেছি।
- EasyMock.expect() মেথডটি দিয়ে মক অবজেক্টের আচরণ নির্ধারণ করা হয়েছে, যেখানে আমরা বলেছি যে, যদি
processPayment(100)কল করা হয়, তাহলে এটি true রিটার্ন করবে। - EasyMock.replay() মক অবজেক্টটি কার্যকর করতে ব্যবহৃত হয়, এবং EasyMock.verify() মক অবজেক্টের সাথে সমস্ত ইন্টারঅ্যাকশন যাচাই করতে ব্যবহৃত হয়।
আউটপুট:
Test passed successfully.
2. Class এর জন্য Mock তৈরি
Class এর জন্য মক তৈরি করার সময়, আপনি EasyMock.createMock() ব্যবহার করতে পারেন, তবে EasyMock ক্লাসের জন্য partial mocking বা full mocking সমর্থন করে। অর্থাৎ, আপনি ক্লাসের কিছু মেথডের আচরণ মক করতে পারেন বা পুরো ক্লাসটিকে মক করতে পারেন।
2.1. Full Mocking for a Class Example
এখানে একটি Car ক্লাস রয়েছে, যা একটি Engine অবজেক্টের উপর নির্ভরশীল। আমরা এই Car ক্লাসের জন্য মক অবজেক্ট তৈরি করতে পারি।
import org.easymock.EasyMock;
import org.junit.Test;
import static org.junit.Assert.*;
class Engine {
public void start() {
System.out.println("Engine started.");
}
}
class Car {
private Engine engine;
public Car(Engine engine) {
this.engine = engine;
}
public void startCar() {
engine.start();
System.out.println("Car started.");
}
}
// Test Class
public class ClassMockExample {
@Test
public void testStartCar() {
// Create mock object for the Engine class
Engine engineMock = EasyMock.createMock(Engine.class);
// Define behavior for the mock object
engineMock.start();
EasyMock.expectLastCall().once();
// Activate the mock
EasyMock.replay(engineMock);
// Create Car object with the mock Engine
Car car = new Car(engineMock);
// Using the mock object
car.startCar();
// Verify the mock
EasyMock.verify(engineMock);
}
}
ব্যাখ্যা:
- Engine ক্লাসটি একটি সিম্পল ক্লাস যা start() মেথডে একটি কার্যকলাপ সম্পাদন করে।
- Car ক্লাসের startCar() মেথড Engine ক্লাসের start() মেথডের উপর নির্ভরশীল।
- আমরা Engine ক্লাসের জন্য মক অবজেক্ট তৈরি করেছি এবং Car ক্লাসের সাথে ব্যবহার করেছি। এটি নিশ্চিত করেছে যে Car ক্লাসের startCar() মেথডে Engine এর start() মেথডটি একবার কল হবে।
আউটপুট:
Engine started.
Car started.
2.2. Partial Mocking for a Class Example
EasyMock ক্লাসের partial mocking এর মাধ্যমে আপনি আসল ক্লাসের কিছু মেথড মক করতে পারেন, এবং কিছু মেথড আসলভাবে কাজ করতে দেয়।
import org.easymock.EasyMock;
import org.junit.Test;
import static org.junit.Assert.*;
class Engine {
public void start() {
System.out.println("Engine started.");
}
public void stop() {
System.out.println("Engine stopped.");
}
}
class Car {
private Engine engine;
public Car(Engine engine) {
this.engine = engine;
}
public void startCar() {
engine.start();
System.out.println("Car started.");
}
public void stopCar() {
engine.stop();
System.out.println("Car stopped.");
}
}
// Test Class
public class PartialMockingExample {
@Test
public void testStartCar() {
// Create partial mock for Engine class
Engine engineMock = EasyMock.partialMockBuilder(Engine.class)
.addMockedMethod("start")
.createMock();
// Define behavior for the mock object
engineMock.start();
EasyMock.expectLastCall().once();
// Activate the mock
EasyMock.replay(engineMock);
// Create Car object with the mock Engine
Car car = new Car(engineMock);
// Using the mock object
car.startCar();
// Verify the mock
EasyMock.verify(engineMock);
}
}
ব্যাখ্যা:
- Engine ক্লাসের start() মেথডটি partial mock করা হয়েছে, এবং stop() মেথডটি আসলভাবে কাজ করবে।
- EasyMock.partialMockBuilder() মেথডটি ব্যবহার করে আমরা partial mock তৈরি করেছি এবং start() মেথডটি মক করেছি।
আউটপুট:
Engine started.
Car started.
3. Mocking Interface এবং Class এর জন্য EasyMock এর সুবিধা
- Interface Mocking: EasyMock ইন্টারফেসের জন্য মক তৈরি করতে খুবই কার্যকরী, কারণ এটি শুধুমাত্র ইন্টারফেসের আচরণ নির্ধারণ করে এবং আসল ক্লাসের কোনো বাস্তবায়ন প্রয়োজন হয় না।
- Class Mocking: ক্লাসের জন্য মক তৈরি করার সময়, আপনি full mock বা partial mock উভয়ই করতে পারেন, যা আপনার টেস্টিং এর জন্য অত্যন্ত নমনীয়তা প্রদান করে।
- Behavior Verification: আপনি মক অবজেক্টের আচরণ সুনির্দিষ্টভাবে নির্ধারণ এবং যাচাই করতে পারেন।
সারাংশ
EasyMock Java টেস্টিংয়ের জন্য একটি অত্যন্ত শক্তিশালী টুল যা আপনাকে interface এবং class উভয়ের জন্য মক অবজেক্ট তৈরি করতে সহায়ক। এটি বিভিন্ন ধরনের মকিং (full mock, partial mock) এর মাধ্যমে নির্ভরশীলতার আচরণকে নিয়ন্ত্রণ এবং যাচাই করার সুবিধা প্রদান করে। Interface Mocking সাধারণত কোডের নমনীয়তা এবং এক্সটেনসিবিলিটি বাড়াতে ব্যবহৃত হয়, যখন Class Mocking এ আপনি আসল ক্লাসের মেথডগুলির আচরণ পরিবর্তন করতে পারেন, যা টেস্টিংয়ের জন্য অত্যন্ত কার্যকরী।
Read more