Guice একটি dependency injection (DI) ফ্রেমওয়ার্ক হিসেবে খুবই জনপ্রিয়, তবে Guice ব্যবহার করার সময়, ডিপেন্ডেন্সি ইনজেকশনকে সঠিকভাবে টেস্ট করা গুরুত্বপূর্ণ। Guice ব্যবহারের ফলে আপনি যে loose coupling পাবেন, তার ফলে আপনি সহজেই ইউনিট টেস্ট তৈরি করতে পারবেন, কারণ আপনি সহজেই ডিপেন্ডেন্সি গুলো মক (mock) বা স্টাব (stub) করতে পারেন।
এখানে আমরা দেখব কিভাবে Guice-এর সাহায্যে unit testing করা যেতে পারে।
Unit Testing এর জন্য Guice ব্যবহার:
Guice এর জন্য unit tests সাধারণত JUnit ফ্রেমওয়ার্ক ব্যবহার করে লেখা হয়। Guice ইনজেকশন ব্যবহার করে ডিপেন্ডেন্সি সরবরাহ করা হলেও, আপনি একাধিক টেস্ট কেসে একই ডিপেন্ডেন্সি ইনজেক্ট করে কোডের অংশবিশেষ টেস্ট করতে পারেন।
এখানে আমরা JUnit এবং Mockito ব্যবহার করে Guice টেস্টিংয়ের একটি উদাহরণ দেখব।
Step 1: Maven Dependency
প্রথমে, আপনাকে Maven পম ফাইলে Guice, JUnit, এবং Mockito লাইব্রেরিগুলির ডিপেন্ডেন্সি যোগ করতে হবে।
<dependencies>
<!-- Guice Dependency -->
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>5.0.1</version> <!-- Guice version -->
</dependency>
<!-- JUnit Dependency -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.7.0</version> <!-- JUnit version -->
<scope>test</scope>
</dependency>
<!-- Mockito Dependency for mocking -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>3.7.7</version> <!-- Mockito version -->
<scope>test</scope>
</dependency>
</dependencies>
Step 2: Guice Setup এবং Test Class তৈরি করা
এখন, আমরা একটি সহজ Service ক্লাস এবং তার dependency Database তৈরি করব। তারপর আমরা সেই ক্লাসের জন্য টেস্ট কেস তৈরি করব।
Service এবং Database ক্লাস:
public class Database {
public String getData() {
return "Real Data";
}
}
public class Service {
private final Database database;
// Constructor Injection
public Service(Database database) {
this.database = database;
}
public String fetchData() {
return database.getData();
}
}
Step 3: Guice Module এবং Injector তৈরি করা
এখন, আমরা Guice Module তৈরি করব, যাতে Service এবং Database ক্লাসের মধ্যে ডিপেন্ডেন্সি ম্যানেজ করা যাবে।
import com.google.inject.AbstractModule;
public class TestModule extends AbstractModule {
@Override
protected void configure() {
bind(Database.class).toInstance(new Database()); // Bind Real Database
}
}
Step 4: Unit Test তৈরি করা
এখন আমরা JUnit এবং Mockito ব্যবহার করে Guice এর জন্য unit test তৈরি করব। এখানে আমরা Database ক্লাসটি mock করব এবং Service ক্লাসের মেথড টেস্ট করব।
import com.google.inject.*;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class ServiceTest {
private Injector injector;
@BeforeEach
public void setUp() {
// Guice Injector তৈরি
injector = Guice.createInjector(new TestModule());
}
@Test
public void testFetchData() {
// Database Mock করা
Database mockDatabase = Mockito.mock(Database.class);
Mockito.when(mockDatabase.getData()).thenReturn("Mock Data");
// Service ইনজেক্ট করা
Service service = new Service(mockDatabase);
// ফেচড ডেটা চেক করা
String result = service.fetchData();
assertEquals("Mock Data", result); // "Mock Data" হওয়া উচিত
}
@Test
public void testFetchDataWithRealDatabase() {
// Real Database ইনজেক্ট করা
Service service = injector.getInstance(Service.class);
// ফেচড ডেটা চেক করা
String result = service.fetchData();
assertEquals("Real Data", result); // "Real Data" হওয়া উচিত
}
}
ব্যাখ্যা:
- Mockito Mocking:
testFetchDataটেস্টে, আমরা Mockito ব্যবহার করেDatabaseক্লাসকে মক করেছি।mockDatabase.getData()মেথডটি আমরা মক করে "Mock Data" রিটার্ন করিয়েছি। - Real Dependency Injection:
testFetchDataWithRealDatabaseটেস্টে, আমরা GuiceInjectorব্যবহার করে আসলDatabaseডিপেন্ডেন্সি ইনজেক্ট করেছি। এটি নিশ্চিত করে যে, Guice সঠিকভাবে ডিপেন্ডেন্সি ইনজেক্ট করছে।
Step 5: Unit Test চালানো
এখন আপনি টেস্টগুলো চালাতে পারেন এবং নিশ্চিত হতে পারেন যে আপনার Service ক্লাসের fetchData মেথড সঠিকভাবে কাজ করছে, এবং Guice সঠিকভাবে ডিপেন্ডেন্সি ইনজেক্ট করছে।
Guice এর জন্য Unit Testing এর সুবিধা
| ফিচার | বিবরণ |
|---|---|
| Easy Dependency Injection | Guice টেস্টের সময় সহজেই ডিপেন্ডেন্সি ইনজেক্ট করার সুযোগ দেয়। |
| Mocking Dependencies | Mockito বা অন্য মকিং ফ্রেমওয়ার্ক ব্যবহার করে ডিপেন্ডেন্সি মক করা যায়। |
| Loose Coupling | Guice DI ব্যবহারের কারণে কোডে loose coupling থাকে, ফলে টেস্টিং সহজ হয়। |
| Testable Code | Guice ডিপেন্ডেন্সি ইনজেকশন ব্যবহার করে কোডের টেস্টিং সহজ এবং কার্যকর করা যায়। |
| Clear and Clean Tests | Unit test গুলি পরিষ্কার, সরল এবং পড়তে সহজ হয়। |
Guice ব্যবহার করে unit testing করা খুবই সহজ এবং কার্যকরী। Mockito বা অন্যান্য mocking টুল ব্যবহার করে আপনি Guice-এ ইনজেক্ট করা ডিপেন্ডেন্সি মক করতে পারেন, এবং Guice dependency injection ব্যবস্থার মাধ্যমে সহজে টেস্টিং করতে পারেন। এর ফলে, loose coupling, testability, এবং modular code নিশ্চিত হয়, যা আপনার অ্যাপ্লিকেশনের মান বৃদ্ধি করে এবং টেস্টিং সহজ করে তোলে।
Read more