Unit Test এ Guice Module Mock করা

Java Technologies - গুইস (Guice) - Guice এবং Unit Testing
263

Guice Dependency Injection (DI) ফ্রেমওয়ার্ক ব্যবহার করে অ্যাপ্লিকেশনের ডিপেনডেন্সিগুলি সহজেই ইনজেক্ট করা যায়। তবে, যখন আপনি unit testing করছেন, তখন কিছু নির্ভরশীলতাকে mock করতে হতে পারে, যাতে পরীক্ষার ক্ষেত্রে আসল ডিপেনডেন্সি না ব্যবহার হয়। Guice-এ mocking করার জন্য আপনি Mockito বা GuiceTest এর মতো লাইব্রেরি ব্যবহার করতে পারেন।

Guice Module কে mock করতে হলে আপনাকে Mockito বা অন্য কোনো mocking লাইব্রেরি ব্যবহার করতে হবে। এই প্রসঙ্গে, আমি Mockito এর সাহায্যে Guice Module মক করার উদাহরণ দেখাব।


Guice Module Mock করার জন্য পদক্ষেপ

  1. Mockito এর সাহায্যে Guice Module Mock করা
  2. Guice Injector দিয়ে Mock করা ডিপেনডেন্সি ইনজেক্ট করা
  3. Unit Test লিখা

Step 1: প্রাথমিক কোড তৈরি করা (Guice Module এবং Service)

ধরা যাক, আমাদের একটি Service ইন্টারফেস এবং তার কনক্রিট (Concrete) ক্লাস ServiceImpl রয়েছে। আমরা এখানে একটি Guice Module ব্যবহার করব, এবং সেই মডিউলটি mock করা হবে Unit Testing-এর সময়।

public interface Service {
    void serve();
}

public class ServiceImpl implements Service {
    @Override
    public void serve() {
        System.out.println("Service is serving...");
    }
}

এখন, Guice Module তৈরি করি যা Service ইন্টারফেসের জন্য ServiceImpl কনক্রিট ক্লাসের ইনস্ট্যান্স তৈরি করবে।

import com.google.inject.AbstractModule;

public class AppModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(Service.class).to(ServiceImpl.class);
    }
}

Step 2: Unit Test এ Mockito ব্যবহার করে Guice Module Mock করা

এখন, আমাদের Service এর একটি মক (mock) তৈরি করতে হবে, যাতে আমরা বাস্তব ইমপ্লিমেন্টেশন না ব্যবহার করি। Mockito ব্যবহার করে ডিপেনডেন্সি মক করতে হবে এবং Guice Injector এর মাধ্যমে সেই মক ডিপেনডেন্সি ইনজেক্ট করতে হবে।

Unit Test কোড

import com.google.inject.Guice;
import com.google.inject.Injector;
import org.junit.Before;
import org.junit.Test;
import static org.mockito.Mockito.*;
import static org.junit.Assert.*;

public class ServiceTest {

    private Service mockService;

    @Before
    public void setUp() {
        // Mockito ব্যবহার করে Service এর মক তৈরি
        mockService = mock(Service.class);
        
        // Guice Injector দিয়ে মক Service কে ইনজেক্ট করা
        Injector injector = Guice.createInjector(new AppModule() {
            @Override
            protected void configure() {
                bind(Service.class).toInstance(mockService); // মক সার্ভিস বেঁধে দেওয়া
            }
        });
        
        // Mocked Service কে Guice Injector এর মাধ্যমে ইনজেক্ট করা
        Service service = injector.getInstance(Service.class);
        
        // যখন service.serve() কল করা হবে, তখন মক হওয়া মেথডটি কল হবে
        when(mockService.serve()).thenReturn(null);  // আমরা মক সার্ভিসে কোন রিটার্ন ভ্যালু ফিক্স করেছি।
    }

    @Test
    public void testServiceServe() {
        // Test মেথড
        mockService.serve(); // মক মেথড কল

        // মক মেথড কল হয়েছে কিনা তা যাচাই
        verify(mockService, times(1)).serve();  // verify করব যে মক সার্ভিসের serve() মেথড একবার কল হয়েছে
    }
}

এখানে যা হচ্ছে:

  1. Mockito মকিং: mock(Service.class) ব্যবহার করে Service ইন্টারফেসের একটি মক তৈরি করা হয়েছে।
  2. Guice Module Overriding: Guice Injector তৈরি করার সময়, AppModule মডিউলটিকে override করে মক Service ইনস্ট্যান্সটি inject করা হয়েছে।
  3. Mockito Interaction Verification: verify(mockService, times(1)).serve() ব্যবহার করে পরীক্ষা করা হচ্ছে যে serve() মেথডটি একবার কল হয়েছে কিনা।

Step 3: আরও Complex Mocking

যদি আপনার Guice Module-এ আরো অনেক ডিপেনডেন্সি থাকে, এবং আপনি সেগুলোর জন্য mocking করতে চান, তবে আপনি একাধিক মক করতে পারবেন এবং তাদের জন্য binding কনফিগার করতে পারবেন।

import com.google.inject.AbstractModule;
import com.google.inject.Inject;
import com.google.inject.Injector;

public class AppModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(Service.class).to(ServiceImpl.class);
        bind(DatabaseService.class).to(DatabaseServiceImpl.class);  // অতিরিক্ত ডিপেনডেন্সি
    }
}

public class DatabaseService {
    public void connect() {
        // Connection logic
    }
}

public class DatabaseServiceImpl extends DatabaseService {
    @Override
    public void connect() {
        // Actual connection logic
    }
}

public class Client {
    private final Service service;
    private final DatabaseService databaseService;

    @Inject
    public Client(Service service, DatabaseService databaseService) {
        this.service = service;
        this.databaseService = databaseService;
    }

    public void performAction() {
        service.serve();
        databaseService.connect();
    }
}

এখানে, Client ক্লাসে দুইটি ডিপেনডেন্সি ইনজেক্ট করা হয়েছে: Service এবং DatabaseService। আমাদের Unit Test এ, আমরা DatabaseService-কে মক করে কোডের কার্যকারিতা পরীক্ষা করতে পারি।

@Test
public void testClientService() {
    // মক করা ডিপেনডেন্সি
    Service mockService = mock(Service.class);
    DatabaseService mockDatabaseService = mock(DatabaseService.class);
    
    // Guice Injector দিয়ে মক ডিপেনডেন্সি ইনজেক্ট করা
    Injector injector = Guice.createInjector(new AbstractModule() {
        @Override
        protected void configure() {
            bind(Service.class).toInstance(mockService);
            bind(DatabaseService.class).toInstance(mockDatabaseService);
        }
    });

    Client client = injector.getInstance(Client.class);
    client.performAction();
    
    // যাচাই করা যে `performAction` মেথডে সঠিকভাবে মক সার্ভিস এবং ডাটাবেস কনেকশন কল হচ্ছে
    verify(mockService, times(1)).serve();
    verify(mockDatabaseService, times(1)).connect();
}

এখানে, Client ক্লাসে দুইটি মক ডিপেনডেন্সি ইনজেক্ট করা হয়েছে এবং তাদের মেথড কলের কার্যকারিতা যাচাই করা হয়েছে।

Guice Module Mocking করা এবং Mockito ব্যবহার করে Unit Testing করা একটি শক্তিশালী কৌশল যা আপনার কোডের unit testing প্রক্রিয়াকে সহজ এবং কার্যকরী করে তোলে। আপনি Guice-এ inject করা ডিপেনডেন্সি মক করে পরীক্ষার সময় মূল বাস্তব অবজেক্ট থেকে আলাদা রাখতে পারেন। এটি testing flexibility এবং isolation নিশ্চিত করে, যাতে আপনি শুধু নির্দিষ্ট ফাংশনালিটি পরীক্ষা করতে পারেন এবং অন্যান্য ডিপেনডেন্সি থেকে আলাদা থাকতে পারেন।

Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...