JUnit হল একটি জনপ্রিয় টেস্টিং ফ্রেমওয়ার্ক যা Java প্রোগ্রামিং ভাষায় ইউনিট টেস্টিং করতে ব্যবহৃত হয়। JUnit টেস্টিংয়ে Mockito লাইব্রেরি ব্যবহার করা হয় মকিং (Mocking) এবং স্পাইং (Spying) করার জন্য, যা টেস্টিংয়ের সময় নির্দিষ্ট উপাদানগুলোর আচরণ নিয়ন্ত্রণ করতে সহায়তা করে। Mockito এর মাধ্যমে @Mock, @InjectMocks, এবং @Spy অ্যানোটেশন ব্যবহার করে কোডের নির্দিষ্ট অংশের মক এবং স্পাই তৈরি করা যায়।
এই টিউটোরিয়ালে আমরা @Mock, @InjectMocks, এবং @Spy এর ব্যবহার এবং তাদের প্রয়োজনীয়তা সম্পর্কে আলোচনা করব।
১. @Mock এর ব্যবহার
@Mock অ্যানোটেশনটি ব্যবহৃত হয় একটি মক অবজেক্ট তৈরি করতে, যা একটি আসল অবজেক্টের আচরণ নকল করে। এটি টেস্টিংয়ের সময় কোনো নির্দিষ্ট কম্পোনেন্টের বাস্তব আচরণ বা এক্সটার্নাল সিস্টেম কল এড়াতে সাহায্য করে, এবং আপনি এই মক অবজেক্টের উপর পরীক্ষা চালাতে পারেন।
উদাহরণ:
ধরা যাক, আপনার একটি UserService ক্লাস আছে এবং এটি UserRepository কে ব্যবহার করে ডেটা রিট্রিভ করার জন্য।
public class UserService {
private UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public User getUserById(int id) {
return userRepository.findById(id);
}
}
এখন, UserRepository ক্লাসের জন্য @Mock ব্যবহার করা যেতে পারে:
import org.junit.jupiter.api.Test;
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;
public class UserServiceTest {
@Mock
private UserRepository userRepository; // Mock object
@Test
public void testGetUserById() {
UserService userService = new UserService(userRepository);
User user = new User(1, "John Doe");
when(userRepository.findById(1)).thenReturn(user); // Mock behavior
User result = userService.getUserById(1);
assertEquals("John Doe", result.getName()); // Verify the result
}
}
এখানে @Mock ব্যবহার করে UserRepository মক করা হয়েছে, এবং আমরা মক অবজেক্টের উপর টেস্টিং করছি।
২. @InjectMocks এর ব্যবহার
@InjectMocks অ্যানোটেশনটি ব্যবহৃত হয়, মক অবজেক্টগুলিকে টেস্ট অবজেক্টে ইনজেক্ট করতে। এটি সেই ক্লাসটিতে ইনজেক্ট করে যা @Mock এর মাধ্যমে মক করা ডিপেনডেন্সি ব্যবহার করে।
উদাহরণ:
public class UserService {
private UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public User getUserById(int id) {
return userRepository.findById(id);
}
}
এখানে, @InjectMocks ব্যবহার করে UserService ক্লাসে UserRepository মক অবজেক্ট ইনজেক্ট করা যাবে:
import org.junit.jupiter.api.Test;
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;
public class UserServiceTest {
@Mock
private UserRepository userRepository; // Mock object
@InjectMocks
private UserService userService; // Inject mocks into UserService
@Test
public void testGetUserById() {
User user = new User(1, "John Doe");
when(userRepository.findById(1)).thenReturn(user); // Mock behavior
User result = userService.getUserById(1);
assertEquals("John Doe", result.getName()); // Verify the result
}
}
এখানে @InjectMocks ব্যবহার করে UserService ক্লাসে UserRepository মক অবজেক্ট ইনজেক্ট করা হয়েছে। এখন, UserService এর মেথডগুলি userRepository এর মক ডেটার সাথে পরীক্ষা করা যাবে।
৩. @Spy এর ব্যবহার
@Spy অ্যানোটেশনটি ব্যবহৃত হয় আসল অবজেক্টের উপর স্পাই তৈরি করতে, যার মাধ্যমে আপনি নির্দিষ্ট মেথডগুলিকে মক করতে পারেন, তবে অন্যান্য মেথডগুলো আসল আচরণ অনুসরণ করবে। এটি মূলত মক এবং আসল অবজেক্টের মিশ্রণ হিসেবে কাজ করে।
উদাহরণ:
ধরা যাক, আপনার একটি OrderService ক্লাস রয়েছে যা অর্ডার প্রসেসিংয়ের জন্য OrderRepository ব্যবহার করে।
public class OrderService {
private OrderRepository orderRepository;
public OrderService(OrderRepository orderRepository) {
this.orderRepository = orderRepository;
}
public String processOrder(int orderId) {
Order order = orderRepository.findOrderById(orderId);
// Process order
return "Order processed: " + order.getId();
}
}
এখন, @Spy ব্যবহার করে আমরা আসল OrderService এর কিছু মেথড স্পাই করতে পারি:
import org.junit.jupiter.api.Test;
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;
public class OrderServiceTest {
@Spy
private OrderRepository orderRepository = new OrderRepository(); // Spy object
@InjectMocks
private OrderService orderService; // Inject mocks into OrderService
@Test
public void testProcessOrder() {
Order order = new Order(1, "Laptop");
when(orderRepository.findOrderById(1)).thenReturn(order); // Mock behavior for spy
String result = orderService.processOrder(1);
assertEquals("Order processed: 1", result); // Verify the result
}
}
এখানে, @Spy ব্যবহার করে OrderRepository এর আসল অবজেক্টের ওপর কিছু মেথডের আচরণ নিয়ন্ত্রণ করা হয়েছে, এবং @InjectMocks এর মাধ্যমে মক অবজেক্ট OrderService এ ইনজেক্ট করা হয়েছে।
সারাংশ
- @Mock: এটি একটি মক অবজেক্ট তৈরি করে যা আসল অবজেক্টের আচরণ নকল করে। এটি সাধারণত ডিপেনডেন্সি মকিংয়ের জন্য ব্যবহৃত হয়।
- @InjectMocks: এটি মক অবজেক্টগুলিকে টেস্ট অবজেক্টে ইনজেক্ট করে।
- @Spy: এটি আসল অবজেক্টের ওপর স্পাই তৈরি করে, এবং আপনি নির্দিষ্ট মেথডগুলিকে মক করতে পারেন, তবে অন্য মেথডগুলি আসল আচরণ অনুসরণ করবে।
এই অ্যানোটেশনগুলো JUnit টেস্টিংয়ে মকিং এবং স্পাইংকে সহজ ও কার্যকরী করে তোলে, যা টেস্টিং প্রক্রিয়াকে আরও নির্ভুল এবং দ্রুত করে তোলে।
Read more