EasyMock একটি mocking framework যা unit testing এর জন্য ব্যবহার করা হয়, কিন্তু কিছু বিশেষ ধরনের অবজেক্ট এবং মেথড মক করার ক্ষেত্রে কিছু চ্যালেঞ্জ আসে। বিশেষত constructors এবং final methods মক করার ক্ষেত্রে কিছু সীমাবদ্ধতা থাকতে পারে। তবে, EasyMock সেগুলিকে মোকাবেলা করার জন্য কিছু কৌশল সরবরাহ করে।
1. Constructor Mocking
কনস্ট্রাক্টরের মকিং কিছুটা জটিল হতে পারে, কারণ EasyMock সরাসরি কনস্ট্রাক্টরকে মক করতে পারে না। তবে, আপনি mocking framework যেমন PowerMock বা Mockito ব্যবহার করে কনস্ট্রাক্টর মক করতে পারেন।
EasyMock দ্বারা কনস্ট্রাক্টর মক করার জন্য partial mocking ব্যবহার করা যেতে পারে, তবে এটি সাধারণত constructor injection এর মাধ্যমে ডিপেনডেন্সি ইনজেকশনকে মক করার জন্য ব্যবহৃত হয়, এবং কিছু পদ্ধতি ব্যবহার করা হতে পারে যেখানে কনস্ট্রাক্টরের পরিবর্তে setter methods অথবা factory methods ব্যবহার করা হয়।
1.1. Constructor Injection Example
ধরা যাক আমাদের একটি Car ক্লাস আছে, যা একটি Engine অবজেক্টের উপর নির্ভরশীল।
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.");
}
}
public class ConstructorInjectionExample {
public static void main(String[] args) {
Engine engineMock = EasyMock.createMock(Engine.class);
engineMock.start();
EasyMock.expectLastCall().once();
EasyMock.replay(engineMock);
// Using the mock object in constructor
Car car = new Car(engineMock);
car.startCar();
EasyMock.verify(engineMock);
}
}
এখানে আমরা Engine ক্লাসের মক অবজেক্ট ব্যবহার করছি, এবং Car ক্লাসের কনস্ট্রাক্টর ইনজেকশন (constructor injection) এর মাধ্যমে সেটি ইনজেক্ট করছি।
1.2. PowerMock এর মাধ্যমে Constructor Mocking
EasyMock সরাসরি কনস্ট্রাক্টর মক করতে সক্ষম না হলেও PowerMock ব্যবহার করে কনস্ট্রাক্টর মক করা সম্ভব। PowerMock একটি mocking framework যা EasyMock, Mockito এর সাথে কাজ করতে পারে এবং কনস্ট্রাক্টর, static methods, final methods ইত্যাদি মক করতে পারে।
import org.easymock.EasyMock;
import org.powermock.api.easymock.PowerMock;
import org.junit.Test;
public class PowerMockConstructorTest {
@Test
public void testConstructorMocking() throws Exception {
// Creating the mock object
Car carMock = PowerMock.createMock(Car.class);
// Defining the behavior
EasyMock.expect(carMock.startCar()).andReturn("Mocked Car Start");
// Activate the mock
PowerMock.replayAll();
// Create the mock object
Car car = new Car(new Engine());
car.startCar();
// Verify the mock
PowerMock.verifyAll();
}
}
ব্যাখ্যা:
- PowerMock ব্যবহার করে কনস্ট্রাক্টরের মকিং করা হয়েছে।
- এই পদ্ধতিতে, PowerMock
createMock()মেথড ব্যবহার করে কনস্ট্রাক্টরের মক তৈরি করা হয়।
2. Mocking Final Methods
Final methods এমন মেথড যা একবার ডিফাইন হলে তার overriding করা যায় না, এবং EasyMock সাধারণভাবে final methods মক করতে সক্ষম নয়। তবে, PowerMock এই সীমাবদ্ধতা কাটিয়ে উঠতে সক্ষম।
2.1. Final Method Mocking Example (Using PowerMock)
ধরা যাক আমাদের একটি Vehicle ক্লাস রয়েছে যার একটি final মেথড আছে।
class Vehicle {
public final void startEngine() {
System.out.println("Engine started");
}
}
public class FinalMethodMockingExample {
@Test
public void testFinalMethodMocking() {
// Creating the mock object
Vehicle vehicleMock = PowerMock.createMock(Vehicle.class);
// Mocking the final method
vehicleMock.startEngine();
PowerMock.expectLastCall().once();
// Activating the mock
PowerMock.replayAll();
// Using the mocked final method
vehicleMock.startEngine();
// Verifying the mock
PowerMock.verifyAll();
}
}
ব্যাখ্যা:
- Vehicle ক্লাসের startEngine() মেথডটি final হিসেবে ডিফাইন করা হয়েছে।
- PowerMock ব্যবহার করে আমরা final method মক করেছি এবং এর আচরণ যাচাই করেছি।
2.2. Mockito এর মাধ্যমে Final Method Mocking
Mockito 2.x সংস্করণ থেকে final methods মক করতে সমর্থন প্রদান করে, তবে Mockito এর সাথে PowerMock ব্যবহার করা প্রয়োজন হতে পারে।
import org.mockito.Mockito;
public class FinalMethodMockingWithMockito {
@Test
public void testFinalMethodMocking() {
Vehicle vehicleMock = Mockito.mock(Vehicle.class);
// Mocking final method
Mockito.doNothing().when(vehicleMock).startEngine();
// Using the mock
vehicleMock.startEngine();
// Verifying
Mockito.verify(vehicleMock).startEngine();
}
}
ব্যাখ্যা:
- Mockito ব্যবহার করে আমরা final মেথড মক করেছি।
- Mockito.doNothing() ব্যবহার করে আমরা নিশ্চিত করেছি যে startEngine() মেথডটি কিছুই করবে না, তবে এটি কল হতে পারে।
3. PowerMock Setup for Constructor and Final Method Mocking
PowerMock এর মাধ্যমে কনস্ট্রাক্টর এবং final methods মক করার জন্য নিম্নলিখিত ধাপগুলি অনুসরণ করতে হবে:
- Maven Dependency for PowerMock:
- PowerMock এর জন্য pom.xml এ নিম্নলিখিত ডিপেন্ডেন্সি যুক্ত করুন:
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-easymock</artifactId>
<version>2.0.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>2.0.0</version>
<scope>test</scope>
</dependency>
- JUnit Test Class Setup:
- PowerMock এর জন্য টেস্ট ক্লাসে @RunWith(PowerMockRunner.class) এবং @PrepareForTest(ClassToMock.class) অ্যানোটেশন যুক্ত করুন।
import org.junit.runner.RunWith;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.api.easymock.PowerMock;
import org.junit.Test;
@RunWith(PowerMockRunner.class)
@PrepareForTest(Vehicle.class)
public class PowerMockTest {
@Test
public void testFinalMethodMocking() {
Vehicle vehicleMock = PowerMock.createMock(Vehicle.class);
PowerMock.expect(vehicleMock.startEngine()).andReturn(null);
PowerMock.replayAll();
vehicleMock.startEngine();
PowerMock.verifyAll();
}
}
সারাংশ
- EasyMock সরাসরি constructors এবং final methods মক করতে পারে না, তবে PowerMock এই সীমাবদ্ধতাগুলি কাটিয়ে উঠতে সক্ষম।
- PowerMock ব্যবহার করে আপনি constructor mocking এবং final method mocking সহজেই করতে পারেন।
- Mockito এবং PowerMock এর সংমিশ্রণেও final methods মক করা সম্ভব।
- EasyMock-এ, আপনি কেবলমাত্র partial mocking বা constructor injection ব্যবহার করে নির্ভরশীলতা ইনজেক্ট করতে পারেন।
এই কৌশলগুলি unit testing এ আপনার কোডের নির্ভরশীলতাগুলিকে মক করতে সাহায্য করবে, যাতে আপনি কার্যকরী টেস্টিং করতে পারেন।
Read more