JUnit হল একটি জনপ্রিয় টেস্টিং ফ্রেমওয়ার্ক যা Java প্রোগ্রামে ইউনিট টেস্টিং সহজ করে তোলে। এটি বিশেষ করে ডেভেলপারদের জন্য গুরুত্বপূর্ণ, কারণ এটি কোডের বিভিন্ন ইউনিট বা মেথডের সঠিকতা যাচাই করতে সহায়তা করে। অন্যদিকে, Mockito হল একটি মকিং ফ্রেমওয়ার্ক যা JUnit টেস্টিংয়ের জন্য মক অবজেক্ট তৈরি করতে ব্যবহৃত হয়, যখন আপনি ডিপেনডেন্সি ইনজেকশন বা কোনো এক্সটার্নাল সিস্টেমকে মক করতে চান।
এই টিউটোরিয়ালে, আমরা Mockito এবং JUnit দিয়ে Service Layer এর টেস্টিং দেখব। Service Layer সাধারণত ব্যবসায়িক লজিক ধারণ করে এবং ডাটাবেসের সাথে যোগাযোগ করতে পারে, তবে আমরা এখানে মকিংয়ের মাধ্যমে টেস্ট করব।
১. JUnit এবং Mockito Setup
প্রথমে আপনাকে JUnit এবং Mockito এর ডিপেনডেন্সি আপনার pom.xml (Maven) বা build.gradle (Gradle) ফাইলে যোগ করতে হবে।
Maven Dependency (pom.xml)
<dependencies>
<!-- JUnit Dependency -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.7.0</version>
<scope>test</scope>
</dependency>
<!-- Mockito Dependency -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>3.7.7</version>
<scope>test</scope>
</dependency>
<!-- JUnit Vintage Engine for JUnit 4 tests -->
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<version>5.7.0</version>
<scope>test</scope>
</dependency>
</dependencies>
Gradle Dependency (build.gradle)
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
testImplementation 'org.mockito:mockito-core:3.7.7'
testRuntimeOnly 'org.junit.vintage:junit-vintage-engine:5.7.0'
}
২. Service Layer Test করার জন্য প্রয়োজনীয় ক্লাস
ধরা যাক, আমাদের একটি UserService ক্লাস রয়েছে যা UserRepository এর মাধ্যমে ডাটাবেসে User অবজেক্ট সংরক্ষণ ও রিটার্ন করে।
User.java (Model)
public class User {
private String name;
private int age;
// Constructor, Getters and Setters
}
UserRepository.java (Repository Interface)
public interface UserRepository {
User save(User user);
}
UserService.java (Service Layer)
public class UserService {
private UserRepository userRepository;
// Constructor injection
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public User createUser(String name, int age) {
User user = new User(name, age);
return userRepository.save(user);
}
}
এখানে, UserService ক্লাসে createUser মেথডটি UserRepository এর save মেথড ব্যবহার করে ডাটাবেসে একটি নতুন ব্যবহারকারী তৈরি করে।
৩. Mockito এবং JUnit দিয়ে Service Layer Test করা
এখন আমরা Mockito ব্যবহার করে UserRepository এর মক অবজেক্ট তৈরি করব এবং UserService এর createUser মেথডটিকে টেস্ট করব।
UserServiceTest.java (JUnit Test)
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;
public class UserServiceTest {
@Mock
private UserRepository userRepository; // Mocking the UserRepository
@InjectMocks
private UserService userService; // Injecting the mocked repository into the service
@BeforeEach
public void setup() {
MockitoAnnotations.openMocks(this); // Initialize the mock objects
}
@Test
public void testCreateUser() {
// Arrange
User user = new User("John", 25);
when(userRepository.save(any(User.class))).thenReturn(user); // Mocking the save method
// Act
User createdUser = userService.createUser("John", 25);
// Assert
assertNotNull(createdUser);
assertEquals("John", createdUser.getName());
assertEquals(25, createdUser.getAge());
verify(userRepository, times(1)).save(any(User.class)); // Verifying that save was called once
}
}
Explanation:
- @Mock: Mockito ব্যবহার করে UserRepository এর মক অবজেক্ট তৈরি করা হয়েছে।
- @InjectMocks: UserService এ UserRepository এর মক অবজেক্ট ইনজেক্ট করা হয়েছে।
- MockitoAnnotations.openMocks(this): মক অবজেক্ট ইনিশিয়ালাইজ করতে ব্যবহৃত হয়।
- when(userRepository.save(any(User.class))).thenReturn(user): আমরা save মেথডকে মক করছি যাতে এটি একটি নির্দিষ্ট ইউজার অবজেক্ট রিটার্ন করে।
- assertNotNull(createdUser): পরীক্ষার উদ্দেশ্যে যাচাই করা হয়েছে যে, createdUser অবজেক্টটি null নয়।
- verify(userRepository, times(1)).save(any(User.class)): নিশ্চিত করা হচ্ছে যে save মেথডটি একবারই কল হয়েছে।
৪. Mockito ব্যবহার করার সুবিধা
- Unit Isolation: Mockito দিয়ে আপনি কোনো নির্ভরশীলতার উপর নির্ভর না করে শুধুমাত্র আপনার কোডের মূল অংশটিকে টেস্ট করতে পারেন। যেমন, ডাটাবেস বা রিমোট সার্ভিস মক করে এটি করা হয়।
- Behavior Verification: Mockito দিয়ে আপনি মেথড কলের আচরণ পরীক্ষা করতে পারেন (যেমন, কতবার কোনো মেথড কল করা হয়েছে)।
- No External Dependencies: প্রকৃত ডাটাবেস বা অন্য সিস্টেমের সাথে ইন্টিগ্রেশন ছাড়াই টেস্ট করা যায়, ফলে টেস্টিং দ্রুত এবং নির্ভরযোগ্য হয়।
সারাংশ
এই উদাহরণে, আমরা Mockito এবং JUnit ব্যবহার করে Service Layer এর টেস্টিং করেছি। Mockito এর সাহায্যে আমরা UserRepository এর মক অবজেক্ট তৈরি করেছি এবং UserService এর createUser মেথডটিকে টেস্ট করেছি। এটি একটি বাস্তব জীবনের উদাহরণ যেখানে Service Layer টেস্টিং এবং মকিংয়ের মাধ্যমে ডিপেনডেন্সি ইনজেকশন সহজভাবে সম্পন্ন করা হয়েছে।
Mockito এবং JUnit এর সাহায্যে ইউনিট টেস্টিং আরও সহজ, দ্রুত এবং নির্ভরযোগ্য হয়ে ওঠে, এবং এটি উন্নত সফটওয়্যার ডেভেলপমেন্ট প্রক্রিয়ার একটি অপরিহার্য অংশ।
Read more