Private Methods সাধারণত ক্লাসের অভ্যন্তরে সীমাবদ্ধ থাকে এবং সাধারণত সরাসরি মক করা যায় না, কারণ এগুলি বাইরের কোড থেকে অ্যাক্সেস করা সম্ভব নয়। তবে, কিছু পরিস্থিতিতে আপনাকে private methods মক করতে হতে পারে, বিশেষত যখন আপনি ক্লাসের অভ্যন্তরীণ লজিক টেস্ট করতে চান।
EasyMock সরাসরি private মেথড মক করার জন্য ডিজাইন করা হয়নি, তবে কিছু কৌশল আছে যেগুলি ব্যবহার করে আপনি private মেথডের আচরণ পরীক্ষা করতে পারেন। এখানে আমরা কয়েকটি পদ্ধতি দেখাবো যা আপনি private methods মক করার জন্য ব্যবহার করতে পারেন।
1. Private Method মক করার জন্য কৌশল
1.1. PowerMock ব্যবহার করা
PowerMock একটি অতিরিক্ত লাইব্রেরি যা EasyMock এর সাথে ইন্টিগ্রেট করা যায় এবং এটি private মেথড, static মেথড, constructor, এবং অন্যান্য কঠিন ধরনের মকিং করার জন্য ব্যবহৃত হয়। PowerMock EasyMock এর উপর ভিত্তি করে কাজ করে এবং সেগুলোর জন্য অতিরিক্ত ফিচার প্রদান করে।
PowerMock এর মাধ্যমে private মেথড মক করা সম্ভব, কিন্তু PowerMock কে ব্যবহার করতে হবে EasyMock এর সাথে একত্রে।
PowerMock এবং EasyMock ব্যবহার করে Private Method মক করা
1.1.1 Maven Dependency যোগ করা
প্রথমে, আপনাকে PowerMock এবং EasyMock এর জন্য Maven ডিপেনডেন্সি যোগ করতে হবে:
<dependencies>
<dependency>
<groupId>org.easymock</groupId>
<artifactId>easymock</artifactId>
<version>4.3</version> <!-- Latest version -->
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-easymock</artifactId>
<version>2.0.9</version> <!-- Latest version -->
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>2.0.9</version> <!-- Latest version -->
<scope>test</scope>
</dependency>
</dependencies>
1.1.2 PowerMock দিয়ে Private Method মক করা
ধরা যাক, আপনার একটি UserService ক্লাস রয়েছে যা একটি private মেথড calculateDiscount() ব্যবহার করে।
public class UserService {
public String getDiscountMessage(int age) {
int discount = calculateDiscount(age);
return "Discount: " + discount + "%";
}
// Private method to be mocked
private int calculateDiscount(int age) {
if (age < 18) {
return 10; // 10% discount for minors
} else {
return 5; // 5% discount for adults
}
}
}
এই calculateDiscount() মেথডটি private হওয়ায় সরাসরি এটি মক করা সম্ভব নয়। তবে, PowerMock এর সাহায্যে আমরা এটিকে মক করতে পারি।
1.1.3 PowerMock দিয়ে মক করা কোড:
import org.easymock.EasyMock;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.easymock.PowerMock;
import org.powermock.modules.junit4.PowerMockRunner;
import static org.easymock.EasyMock.*;
@RunWith(PowerMockRunner.class)
public class UserServiceTest {
@Test
public void testGetDiscountMessage() {
// Create a mock object of UserService
UserService mockUserService = PowerMock.createMock(UserService.class);
// Mocking private method
PowerMock.expectPrivate(mockUserService, "calculateDiscount", 20).andReturn(5); // Mocking private method to return 5% discount
// Activate the mock
PowerMock.replay(mockUserService);
// Test the public method which internally calls the private method
String discountMessage = mockUserService.getDiscountMessage(20); // Should print: Discount: 5%
System.out.println(discountMessage); // Output: Discount: 5%
// Verify that the private method was called correctly
PowerMock.verify(mockUserService);
}
}
ব্যাখ্যা:
- PowerMock.createMock(UserService.class) এর মাধ্যমে
UserServiceক্লাসের মক অবজেক্ট তৈরি করা হয়েছে। - PowerMock.expectPrivate() এর মাধ্যমে আমরা
calculateDiscount()মেথডের জন্য আচরণ ডিফাইন করেছি। এখানে,20আর্গুমেন্ট হিসেবে দেওয়া হয়েছে এবং মক রিটার্ন হিসেবে 5 ডিফাইন করা হয়েছে। - PowerMock.replay(mockUserService) এর মাধ্যমে মক অবজেক্ট সক্রিয় করা হয়েছে।
- PowerMock.verify(mockUserService) এর মাধ্যমে আমরা নিশ্চিত করেছি যে private মেথডটি সঠিকভাবে কল হয়েছে।
2. Alternative Approaches
2.1. Refactor to Use Protected or Public Methods
যদি আপনি private মেথড টেস্ট করতে চান এবং PowerMock ব্যবহার না করতে চান, তাহলে আপনি সিস্টেমকে protected বা public মেথডে রিফ্যাক্টর করতে পারেন। এটি কোডের অ্যাক্সেসিবিলিটি বৃদ্ধি করে এবং টেস্টিং সহজ করে।
2.2. Use Reflection (Not Recommended)
যদি PowerMock ব্যবহার করা সম্ভব না হয়, তাহলে আপনি Java Reflection API ব্যবহার করে private মেথডে অ্যাক্সেস করতে পারেন, তবে এটি সাধারণত খুব ভালো টেস্টিং কৌশল নয় এবং কোডের স্থিতিশীলতা এবং নিরাপত্তার জন্য ঝুঁকি তৈরি করতে পারে।
Private Methods মক করার জন্য PowerMock হল একটি শক্তিশালী এবং জনপ্রিয় টুল যা EasyMock এর সাথে একত্রে ব্যবহার করা যায়। PowerMock এর মাধ্যমে আপনি private, static, এবং constructor মেথডগুলিকে মক করতে পারবেন, যা EasyMock দ্বারা সরাসরি সম্ভব নয়। তবে, এই ধরনের টুল ব্যবহারের আগে কোড রিফ্যাক্টরিং এবং ডিজাইন প্যাটার্ন গুলি বিবেচনা করা উচিত, যাতে টেস্টিংয়ের জন্য কোডের নমনীয়তা বজায় থাকে।
Read more