Spring Framework-এ Mockito এবং @MockBean দুটি গুরুত্বপূর্ণ টুল যা unit testing এবং integration testing এর জন্য ব্যবহৃত হয়। এগুলি Spring Beans-এর টেস্টিং-এর সময় mocking এবং dependency injection এর মাধ্যমে ডিপেনডেন্সি ম্যানেজমেন্টকে সহজ করে তোলে।
Mockito: Overview
Mockito একটি জনপ্রিয় Java mocking ফ্রেমওয়ার্ক যা unit testing-এর জন্য ব্যবহৃত হয়। এটি নির্দিষ্ট ক্লাস বা অবজেক্টের মক (mock) তৈরি করে, যাতে আসল ডিপেনডেন্সি ব্যবহার না করে, শুধুমাত্র ঐ ক্লাসের প্রয়োজনীয় আচরণ পরীক্ষা করা যায়। Mockito মক অবজেক্ট তৈরি করার জন্য অত্যন্ত সুবিধাজনক, বিশেষত যখন আপনি external dependencies বা database access-এর মতো কার্যকারিতা পরীক্ষা করতে চান না।
Mockito এর সুবিধা:
- Dependency Isolation: প্রকৃত ডিপেনডেন্সির পরিবর্তে মক অবজেক্ট ব্যবহার করা হয়।
- Behavior Verification: মক অবজেক্টের আচরণ পরীক্ষা করা যায়।
- State Verification: মক অবজেক্টের অবস্থাও পরীক্ষা করা যায়।
Mockito এর মাধ্যমে Spring Bean মক করা
Spring Beans-এর জন্য Mockito ব্যবহার করে মক তৈরি করা যেতে পারে। নিচের উদাহরণে Mockito দিয়ে একটি Service Layer-র মক তৈরি করা হয়েছে।
উদাহরণ: Mockito দিয়ে Service Layer মক করা
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;
public class UserServiceTest {
@Mock
private UserRepository userRepository;
@InjectMocks
private UserService userService;
@Test
public void testGetUserById() {
// Mocking the repository method
User mockUser = new User(1, "John Doe");
when(userRepository.findById(1)).thenReturn(Optional.of(mockUser));
// Testing the service method
User user = userService.getUserById(1);
// Verifying behavior
assertNotNull(user);
assertEquals("John Doe", user.getName());
// Verifying method interaction
verify(userRepository).findById(1);
}
}
এখানে, Mockito ব্যবহার করে UserRepository এর মক তৈরি করা হয়েছে এবং UserService-এ এই মক অবজেক্ট ইনজেক্ট করা হয়েছে। এই টেস্টে findById(1) মেথডটি মক করা হয়েছে এবং পরীক্ষিত হয়েছে।
@MockBean: Overview
@MockBean হল একটি Spring Boot টেস্ট অ্যানোটেশন যা Mockito এর মক অবজেক্ট Spring Context-এ ইনজেক্ট করতে ব্যবহৃত হয়। এটি মূলত Spring Boot Test টেস্টিং কনটেক্সটে ব্যবহৃত হয়, যেখানে আপনি Spring Beans-এর নির্দিষ্ট অংশকে মক করতে পারেন, যেমন Service, Repository ইত্যাদি, এবং Spring Context-এ ঐ মক অবজেক্টটি ইনজেক্ট করা হয়।
@MockBean সাধারণত @SpringBootTest বা @WebMvcTest টেস্ট কনফিগারেশনের সাথে ব্যবহার করা হয়।
@MockBean এর সুবিধা:
- Mocking in Spring Context: Spring Context-এ Bean গুলির মক অবজেক্ট ইনজেক্ট করা যায়।
- Dependency Injection: সহজে Bean-এর ডিপেনডেন্সি ইনজেক্ট করা যায়, যা মক বা স্টাব হিসেবে কাজ করবে।
- Integration Testing: পুরো Spring Context ব্যবহার করেও ইনটিগ্রেশন টেস্ট করা যায়, যেখানে মক ডিপেনডেন্সির সাথে প্রকৃত Bean-এর সহযোগিতা পরীক্ষিত হয়।
@MockBean এর মাধ্যমে Spring Bean মক করা
@MockBean ব্যবহারের মাধ্যমে আমরা Spring Beans-এর মক তৈরি করতে পারি, যাতে Spring Boot অ্যাপ্লিকেশন কনটেক্সটের মধ্যে ঐ মক Bean সঠিকভাবে কাজ করে।
উদাহরণ: @MockBean দিয়ে Spring Bean মক করা
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
public class UserServiceTest {
@MockBean
private UserRepository userRepository;
@Autowired
private UserService userService;
@Test
public void testGetUserById() {
// Mocking the repository method
User mockUser = new User(1, "John Doe");
when(userRepository.findById(1)).thenReturn(Optional.of(mockUser));
// Testing the service method
User user = userService.getUserById(1);
// Verifying behavior
assertNotNull(user);
assertEquals("John Doe", user.getName());
// Verifying method interaction
verify(userRepository).findById(1);
}
}
এখানে, @MockBean ব্যবহার করে UserRepository Bean-এর মক তৈরি করা হয়েছে এবং Spring context-এ ঐ মক Bean সঠিকভাবে ইনজেক্ট করা হয়েছে। UserService-এ এই মক Bean ইনজেক্ট করা হয় এবং টেস্ট করা হয়।
@MockBean এবং Mockito এর মধ্যে পার্থক্য
- Mockito সাধারণভাবে মক অবজেক্ট তৈরি করার জন্য ব্যবহৃত হয় যা Spring Context-এর বাইরেও ব্যবহার করা যেতে পারে। এটি মক অবজেক্ট তৈরি করে এবং মেথড কলের জন্য আচরণ নির্ধারণ করে।
- @MockBean Spring Test Context-এ মক Bean ইনজেক্ট করার জন্য ব্যবহৃত হয়। এটি মূলত Spring Boot টেস্ট কনটেক্সটে ব্যবহৃত হয় এবং Spring Beans-কে মক করার জন্য সুবিধা প্রদান করে।
Conclusion
Mockito এবং @MockBean টেস্টিংয়ের জন্য অত্যন্ত গুরুত্বপূর্ণ টুল, যা Spring Beans-কে মক করতে সাহায্য করে। Mockito সাধারণভাবে unit testing এবং integration testing-এ ব্যবহৃত হয়, যেখানে আমরা বাহ্যিক ডিপেনডেন্সি বা অন্যান্য কম্পোনেন্টগুলোকে মক করে সেগুলির আচরণ পরীক্ষা করতে পারি। অন্যদিকে, @MockBean Spring Boot টেস্ট কনটেক্সটে ব্যবহৃত হয়, যা Spring Context-এ মক Bean ইনজেক্ট করে এবং Spring Beans-এর মকড ডিপেনডেন্সির সাথে টেস্টিং করতে সহায়তা করে। এ দুটি টুল আপনাকে সহজে এবং কার্যকরীভাবে Spring Bean-এর মকিং এবং টেস্টিং করার সুযোগ প্রদান করে।
Read more