Testing Spring MVC Applications

Java Technologies - স্প্রিং এমভিসি (Spring MVC)
127
127

Spring MVC অ্যাপ্লিকেশনের টেস্টিং একটি গুরুত্বপূর্ণ ধাপ, যা অ্যাপ্লিকেশনটির স্থিতিশীলতা এবং কার্যকারিতা নিশ্চিত করে। Spring Framework টেস্টিংয়ের জন্য বিভিন্ন উপায় সরবরাহ করে, যেমন JUnit, Mockito, এবং Spring TestContext Framework। Spring MVC অ্যাপ্লিকেশন টেস্ট করতে মূলত দুটি টেস্টিং স্ট্র্যাটেজি ব্যবহার করা হয়:

  1. Unit Testing (কন্ট্রোলার, সার্ভিস, রিপোজিটরি স্তরে)
  2. Integration Testing (কমপ্লিট অ্যাপ্লিকেশন স্তরে)

Spring MVC অ্যাপ্লিকেশন টেস্ট করার জন্য সবচেয়ে সাধারণ টুল হল JUnit এবং Spring TestContext Framework। এখানে, আমরা দেখব Spring MVC অ্যাপ্লিকেশন টেস্ট করার জন্য কিছু প্রাসঙ্গিক টুল এবং কৌশল।


1. Unit Testing Spring MVC Controllers:

Spring MVC কন্ট্রোলারের ইউনিট টেস্ট করার জন্য আমরা JUnit, Mockito এবং @WebMvcTest অ্যানোটেশন ব্যবহার করি। @WebMvcTest শুধু MVC লেয়ার (কন্ট্রোলার) টেস্ট করতে ব্যবহৃত হয় এবং এটি Spring context লোড না করেই কন্ট্রোলার কন্টেক্সট তৈরি করে।

কন্ট্রোলারের ইউনিট টেস্ট উদাহরণ:

আমরা একটি কন্ট্রোলার টেস্ট করব যা User ডেটা রিটার্ন করে।

@Controller
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/user/{id}")
    public String getUserById(@PathVariable("id") Long id, Model model) {
        User user = userService.getUserById(id);
        model.addAttribute("user", user);
        return "userProfile";
    }
}

কন্ট্রোলারের টেস্ট কোড:

import static org.mockito.Mockito.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;

@ExtendWith(MockitoExtension.class)
public class UserControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Mock
    private UserService userService;

    private UserController userController;

    @BeforeEach
    public void setup() {
        userController = new UserController(userService);
        mockMvc = MockMvcBuilders.standaloneSetup(userController).build();
    }

    @Test
    public void testGetUserById() throws Exception {
        User mockUser = new User(1L, "John", "john.doe@example.com");
        when(userService.getUserById(1L)).thenReturn(mockUser);

        mockMvc.perform(get("/user/1"))
               .andExpect(status().isOk())
               .andExpect(view().name("userProfile"))
               .andExpect(model().attribute("user", mockUser));
    }
}

এখানে:

  • @WebMvcTest: এটি কেবলমাত্র Spring MVC কন্ট্রোলার টেস্ট করার জন্য ব্যবহৃত হয়।
  • MockMvc: এটি Spring MVC অ্যাপ্লিকেশনটির মধ্যে HTTP রিকোয়েস্ট সম্পাদন করতে ব্যবহৃত হয় এবং রেসপন্স পরীক্ষা করতে সহায়ক।

2. Integration Testing:

Integration Testing-এ পুরো Spring context লোড করা হয় এবং প্রকৃত Spring MVC কন্ট্রোলার এবং সার্ভিস লেয়ারের মধ্যে ইন্টিগ্রেশন পরীক্ষা করা হয়। Spring Boot অ্যাপ্লিকেশনগুলির জন্য, @SpringBootTest অ্যানোটেশন ব্যবহার করা হয়।

Integration Testing উদাহরণ:

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;

@SpringBootTest
public class UserControllerIntegrationTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void testGetUserById() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.get("/user/1"))
               .andExpect(status().isOk())
               .andExpect(view().name("userProfile"))
               .andExpect(model().attributeExists("user"));
    }
}

এখানে:

  • @SpringBootTest: Spring Boot অ্যাপ্লিকেশনটির পুরো context লোড করে।
  • MockMvc: এটি HTTP রিকোয়েস্ট সম্পাদন এবং রেসপন্স পরীক্ষার জন্য ব্যবহৃত হয়।

3. Testing with @MockBean:

@MockBean ব্যবহার করে, Spring Boot অ্যাপ্লিকেশন টেস্টিংয়ের জন্য আমরা সার্ভিস লেয়ার এবং অন্যান্য ডিপেনডেন্সি মক (mock) করতে পারি। এটি মূলত ইন্টিগ্রেশন টেস্টিংয়ে ব্যবহৃত হয় এবং এটি স্প্রিং কন্টেক্সটে মক অবজেক্ট যোগ করতে সহায়ক।

@MockBean উদাহরণ:

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;

import static org.mockito.BDDMockito.given;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

@SpringBootTest
public class UserControllerIntegrationTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private UserService userService;  // Mocking the UserService

    @Test
    public void testGetUserById() throws Exception {
        User mockUser = new User(1L, "John", "john.doe@example.com");
        given(userService.getUserById(1L)).willReturn(mockUser);  // Mock service call

        mockMvc.perform(MockMvcRequestBuilders.get("/user/1"))
               .andExpect(status().isOk())
               .andExpect(view().name("userProfile"))
               .andExpect(model().attribute("user", mockUser));
    }
}

এখানে:

  • @MockBean: UserService মক করা হয়েছে এবং এটি Spring ApplicationContext-এ inject করা হয়েছে।
  • given(): Mockito এর মাধ্যমে মক ডেটা ফেরত দেওয়া হচ্ছে।

4. MockMvc এবং @WebMvcTest ব্যবহার করে কন্ট্রোলার টেস্টিং:

@WebMvcTest Spring MVC কন্ট্রোলার টেস্ট করার জন্য খুবই উপকারী। এটি Spring Boot Test Context লোড করে না, তবে শুধুমাত্র MVC context লোড করে, যার ফলে এটি দ্রুত এবং focused টেস্টিংয়ের জন্য আদর্শ।

@WebMvcTest উদাহরণ:

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.beans.factory.annotation.Autowired;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

@WebMvcTest(UserController.class)  // Test specific controller only
public class UserControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void testGetUserById() throws Exception {
        mockMvc.perform(get("/user/1"))
               .andExpect(status().isOk())
               .andExpect(view().name("userProfile"))
               .andExpect(model().attribute("user", new User(1L, "John", "john.doe@example.com")));
    }
}

এখানে:

  • @WebMvcTest(UserController.class): এটি কেবলমাত্র UserController টেস্ট করবে এবং Spring MVC context তৈরি করবে।
  • MockMvc: এটি HTTP রিকোয়েস্ট এবং রেসপন্স পরীক্ষা করার জন্য ব্যবহৃত হয়েছে।

5. Test Coverage with Mockito:

Mockito একটি জনপ্রিয় মকিং ফ্রেমওয়ার্ক যা Spring টেস্টিংয়ের জন্য ডিপেনডেন্সি মকিং এ সাহায্য করে। আমরা সার্ভিস, রিপোজিটরি এবং কন্ট্রোলারের মক অবজেক্ট তৈরি করতে পারি, যাতে টেস্ট শুধুমাত্র ফাংশনাল লজিক যাচাই করে।

import static org.mockito.Mockito.*;

@ExtendWith(MockitoExtension.class)
public class UserServiceTest {

    @Mock
    private UserRepository userRepository;

    @InjectMocks
    private UserService userService;

    @Test
    public void testGetUserById() {
        User user = new User(1L, "John", "john.doe@example.com");
        when(userRepository.findById(1L)).thenReturn(Optional.of(user));

        User result = userService.getUserById(1L);
        assertEquals("John", result.getName());
    }
}

এখানে:

  • @Mock: মক অবজেক্ট তৈরি করা হয়েছে।
  • @InjectMocks: সার্ভিস ক্লাসে মক অবজেক্ট ইনজেক্ট করা হয়েছে।

উপসংহার:

Spring MVC অ্যাপ্লিকেশন টেস্টিং খুবই গুরুত্বপূর্ণ এবং এটি অ্যাপ্লিকেশনের কার্যকারিতা নিশ্চিত করার জন্য প্রয়োজনীয়। @WebMvcTest, @SpringBootTest, MockMvc, Mockito, JUnit সহ বিভিন্ন টুল ব্যবহার করে কন্ট্রোলার, সার্ভিস এবং রিপোজিটরি স্তরে টেস্টিং করা যায়। এই টেস্টিং কৌশলগুলি আপনাকে Spring MVC অ্যাপ্লিকেশনে গুণগতমান নিশ্চিত করতে সাহায্য করবে।

Content added By

Spring MVC এর জন্য Unit এবং Integration Testing

147
147

Spring MVC অ্যাপ্লিকেশনগুলির জন্য Unit Testing এবং Integration Testing খুবই গুরুত্বপূর্ণ, কারণ এগুলি নিশ্চিত করে যে আপনার কোড সঠিকভাবে কাজ করছে এবং বিভিন্ন কম্পোনেন্ট একসাথে ঠিকভাবে কাজ করছে। Spring Testing ফ্রেমওয়ার্ক JUnit, Mockito, এবং Spring Test সমর্থন করে, যা ইউনিট টেস্ট এবং ইন্টিগ্রেশন টেস্ট করার জন্য শক্তিশালী টুল সরবরাহ করে।

1. Unit Testing in Spring MVC

Unit Testing হল শুধুমাত্র একক ইউনিট (যেমন একটি মেথড বা ক্লাস) পরীক্ষা করা। Spring MVC অ্যাপ্লিকেশনের ক্ষেত্রে, এটি সাধারণত Controller, Service, এবং Repository-এর জন্য করা হয়।

Unit Testing Example for Controller with Mockito

Controller:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.ui.Model;

@Controller
public class MyController {

    private final MyService myService;

    public MyController(MyService myService) {
        this.myService = myService;
    }

    @GetMapping("/greet")
    public String greet(Model model) {
        String message = myService.getGreetingMessage();
        model.addAttribute("message", message);
        return "greet";
    }
}

Service:

import org.springframework.stereotype.Service;

@Service
public class MyService {

    public String getGreetingMessage() {
        return "Hello from Service!";
    }
}

JUnit Test for Controller with Mockito:

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.springframework.ui.Model;

import static org.mockito.Mockito.*;

public class MyControllerTest {

    @Mock
    private MyService myService;

    @Mock
    private Model model;

    private MyController myController;

    @BeforeEach
    public void setup() {
        MockitoAnnotations.openMocks(this);  // Initialize mocks
        myController = new MyController(myService);
    }

    @Test
    public void testGreet() {
        // Given
        when(myService.getGreetingMessage()).thenReturn("Hello, Test!");

        // When
        String result = myController.greet(model);

        // Then
        verify(myService, times(1)).getGreetingMessage(); // Ensure method was called once
        verify(model, times(1)).addAttribute("message", "Hello, Test!"); // Ensure model is updated
        assertEquals("greet", result); // Check the view name
    }
}

Explanation:

  • Mockito: @Mock অ্যানোটেশন ব্যবহার করে মক অবজেক্ট তৈরি করা হয়।
  • MockitoAnnotations.openMocks(this): মক অবজেক্টগুলি ইনিশিয়ালাইজ করা হয়।
  • when(myService.getGreetingMessage()).thenReturn("Hello, Test!"): এটি myService.getGreetingMessage() কল করার সময় একটি কাস্টম রেসপন্স প্রদান করে।
  • verify(): এটি নিশ্চিত করে যে মক অবজেক্টের উপর নির্দিষ্ট মেথড একাধিক বার কল হয়েছে কিনা।

2. Integration Testing in Spring MVC

Integration Testing হল একাধিক কম্পোনেন্টের ইন্টিগ্রেশন পরীক্ষা করা, অর্থাৎ পুরো অ্যাপ্লিকেশন বা কিছু অংশের মেলবন্ধন পরীক্ষা করা। Spring MVC অ্যাপ্লিকেশনগুলিতে, Integration Testing সাধারণত Controller-এর সাথে Service, Repository ইত্যাদির কাজ নিশ্চিত করার জন্য করা হয়।

Spring Test Framework ব্যবহৃত হয় Spring MVC অ্যাপ্লিকেশনে ইনটিগ্রেশন টেস্ট পরিচালনা করতে।

Integration Test Example with Spring Test

Spring Boot Integration Test:

Spring Boot প্রকল্পে @SpringBootTest এবং @WebMvcTest অ্যানোটেশনগুলি ইনটিগ্রেশন টেস্টিংয়ের জন্য ব্যবহৃত হয়।

Controller Integration Test with @SpringBootTest:

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;

@SpringBootTest
public class MyControllerIntegrationTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void testGreet() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.get("/greet"))
               .andExpect(MockMvcResultMatchers.status().isOk())
               .andExpect(MockMvcResultMatchers.view().name("greet"))
               .andExpect(MockMvcResultMatchers.model().attribute("message", "Hello from Service!"));
    }
}

Explanation:

  • @SpringBootTest: Spring Boot অ্যাপ্লিকেশনের সম্পূর্ণ কনটেক্সটে টেস্ট চালায়।
  • MockMvc: এটি Spring MVC কন্ট্রোলার মেথডগুলির HTTP রিকোয়েস্ট এবং রেসপন্স সিমুলেট করতে ব্যবহৃত হয়।
  • MockMvcRequestBuilders.get("/greet"): এটি /greet URL এ GET রিকোয়েস্ট পাঠায়।
  • andExpect(): রিকোয়েস্টের পর ফলস্বরূপ status, view, এবং model যাচাই করা হয়।

Integration Test Example for Service Layer

Service Layer Integration Test:

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import static org.junit.jupiter.api.Assertions.assertEquals;

@SpringBootTest
public class MyServiceIntegrationTest {

    @Autowired
    private MyService myService;

    @Test
    public void testGetGreetingMessage() {
        String message = myService.getGreetingMessage();
        assertEquals("Hello from Service!", message);
    }
}

Explanation:

  • @SpringBootTest: Spring Boot অ্যাপ্লিকেশন কনটেক্সট লোড করে টেস্ট চালায়, যা প্রকৃত সার্ভিসের ইন্টিগ্রেশন নিশ্চিত করে।
  • Service Layer Testing: এখানে আমরা Service লেয়ারের কাজ যাচাই করেছি, যা ডাটাবেস বা অন্য কম্পোনেন্টের সাথে ইন্টিগ্রেটেড হতে পারে।

3. Mocking Dependencies in Integration Testing

Spring Test ফ্রেমওয়ার্কে মকিং করতে Mockito ব্যবহার করা হয়। যখন আপনি প্রকৃত সার্ভিস বা ডাটাবেস ব্যবহার করতে না চান, তখন আপনি মক অবজেক্ট দিয়ে পরীক্ষাগুলি করতে পারেন।

Example: Mocking Repository in Service Layer

import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.beans.factory.annotation.Autowired;
import static org.mockito.Mockito.*;

@ExtendWith(MockitoExtension.class)
public class MyServiceTest {

    @Mock
    private MyRepository myRepository;

    @InjectMocks
    private MyService myService;

    @Test
    public void testGetGreetingMessage() {
        // Arrange
        when(myRepository.getGreeting()).thenReturn("Mocked Greeting");

        // Act
        String message = myService.getGreetingMessage();

        // Assert
        assertEquals("Mocked Greeting", message);
        verify(myRepository, times(1)).getGreeting();  // Ensure method was called
    }
}

Explanation:

  • @Mock: মক অবজেক্ট তৈরি করা হয়েছে।
  • @InjectMocks: সার্ভিস ক্লাসে মক অবজেক্ট ইনজেক্ট করা হয়।
  • when(): মক অবজেক্টে প্রেরিত মেথডের জন্য রিটার্ন মান সেট করা হয়।
  • verify(): এটি নিশ্চিত করে যে মক অবজেক্টের মেথডটি নির্দিষ্ট পরিমাণে কল হয়েছে কিনা।

Conclusion

Spring MVC অ্যাপ্লিকেশনের Unit Testing এবং Integration Testing নিশ্চিত করতে আপনার কোডের কাজ সঠিকভাবে হচ্ছে এবং বিভিন্ন কম্পোনেন্ট একসাথে কার্যকরীভাবে কাজ করছে।

  • Unit Testing: মক অবজেক্ট দিয়ে একক ইউনিট পরীক্ষা করা, যেমন কন্ট্রোলার, সার্ভিস বা রেপোজিটরি।
  • Integration Testing: প্রকৃত Spring Context এবং কম্পোনেন্টের ইন্টিগ্রেশন পরীক্ষা করা, যেমন কন্ট্রোলার এবং সার্ভিস স্তরের একত্রে কাজ নিশ্চিত করা।

Spring Test Framework এবং JUnit, Mockito এর সাহায্যে Spring MVC অ্যাপ্লিকেশনগুলির ইউনিট ও ইন্টিগ্রেশন টেস্ট খুবই সহজ এবং শক্তিশালী।

Content added By

Mockito এবং MockMvc ব্যবহার করে Controller Testing

116
116

Spring MVC অ্যাপ্লিকেশনে Controller Testing এর জন্য Mockito এবং MockMvc দুটি জনপ্রিয় টুল। Mockito হল একটি মকিং ফ্রেমওয়ার্ক যা টেস্টিংয়ে ডিপেনডেন্সি মক (mock) করতে সাহায্য করে, এবং MockMvc হল Spring Test-এর একটি অংশ যা Spring MVC কন্ট্রোলারগুলির জন্য HTTP রিকোয়েস্ট এবং রেসপন্স সিমুলেট করে। এ দুটি টুল ব্যবহার করে আপনি Spring MVC কন্ট্রোলারের কার্যকারিতা পরীক্ষা করতে পারেন।


1. Mockito এবং MockMvc এর সংক্ষিপ্ত পরিচিতি

  • Mockito: এটি একটি জনপ্রিয় Java মকিং ফ্রেমওয়ার্ক যা ডিপেনডেন্সি মক এবং স্পাই করে, বিশেষত ইউনিট টেস্টে ব্যবহৃত হয়। এটি আপনি যখন একাধিক কনট্রোলার বা সার্ভিস এর উপর টেস্ট করতে চান তখন খুব সহায়ক।
  • MockMvc: এটি Spring Test এর একটি অংশ যা Spring MVC কন্ট্রোলারের HTTP রিকোয়েস্ট এবং রেসপন্স পরীক্ষার জন্য ব্যবহৃত হয়। MockMvc এর মাধ্যমে আপনি কন্ট্রোলার মেথডগুলো HTTP রিকোয়েস্টের মাধ্যমে সিমুলেট করতে পারেন, এবং তারপরে তাদের আউটপুট যাচাই করতে পারেন।

2. Spring MVC Controller Testing with Mockito and MockMvc

Step 1: Maven Dependencies

প্রথমে, আপনার pom.xml ফাইলে Mockito এবং Spring Test ডিপেনডেন্সি যুক্ত করতে হবে।

<dependencies>
    <!-- Spring Boot Starter Test -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <!-- Mockito for mocking services or dependencies -->
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-core</artifactId>
        <version>3.9.0</version> <!-- Ensure the version is up to date -->
        <scope>test</scope>
    </dependency>
</dependencies>
  • spring-boot-starter-test ডিপেনডেন্সি এতে MockMvc, Mockito, Spring Test, JUnit ইত্যাদি সমস্ত টেস্টিং টুল অন্তর্ভুক্ত করে।

Step 2: Controller তৈরি

এখানে একটি উদাহরণ কন্ট্রোলার দেওয়া হল, যার জন্য আমরা টেস্ট তৈরি করব।

HomeController.java:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class HomeController {

    @GetMapping("/greet")
    public String greet(@RequestParam String name) {
        if (name == null || name.isEmpty()) {
            throw new IllegalArgumentException("Name cannot be empty");
        }
        return "Hello, " + name + "!";
    }
}

এটি একটি সাধারণ কন্ট্রোলার মেথড, যা name প্যারামিটার নিয়ে একটি গ্রিটিং রিটার্ন করবে। যদি name প্যারামিটার শূন্য থাকে, তাহলে এটি একটি IllegalArgumentException ছুড়ে দেবে।


Step 3: Controller Testing with MockMvc and Mockito

এখন আমরা Mockito এবং MockMvc ব্যবহার করে HomeController এর টেস্ট তৈরি করব।

HomeControllerTest.java:

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.mockito.Mockito.when;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

@SpringBootTest
@ExtendWith(MockitoExtension.class)
public class HomeControllerTest {

    @Autowired
    private WebApplicationContext webApplicationContext;

    private MockMvc mockMvc;

    @BeforeEach
    public void setup() {
        mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
    }

    @Test
    public void testGreetWithValidName() throws Exception {
        mockMvc.perform(get("/greet")
                        .param("name", "John"))
                .andExpect(status().isOk())  // Expect HTTP 200 OK status
                .andExpect(content().string("Hello, John!"));  // Expect "Hello, John!" in response body
    }

    @Test
    public void testGreetWithEmptyName() throws Exception {
        mockMvc.perform(get("/greet")
                        .param("name", ""))
                .andExpect(status().isBadRequest());  // Expect HTTP 400 Bad Request due to IllegalArgumentException
    }

    @Test
    public void testGreetWithNullName() throws Exception {
        mockMvc.perform(get("/greet")
                        .param("name", (String) null))
                .andExpect(status().isBadRequest());  // Expect HTTP 400 Bad Request due to IllegalArgumentException
    }
}
ব্যাখ্যা:
  • MockMvc setup: @Autowired WebApplicationContext এবং MockMvcBuilders ব্যবহার করে আমরা MockMvc সেটআপ করেছি।
  • Test 1: testGreetWithValidName: এটি /greet?name=John URL এ GET রিকোয়েস্ট পাঠায় এবং Hello, John! রেসপন্স আশা করে। যদি name প্যারামিটার সঠিক থাকে, তবে HTTP 200 স্ট্যাটাস কোড এবং সঠিক কন্টেন্ট ফিরিয়ে আসবে।
  • Test 2: testGreetWithEmptyName: এটি /greet?name= URL এ GET রিকোয়েস্ট পাঠায় এবং প্রত্যাশা করে যে এটি HTTP 400 (Bad Request) ত্রুটি ফেরত দেবে, কারণ name প্যারামিটার শূন্য।
  • Test 3: testGreetWithNullName: এটি /greet?name=null URL এ GET রিকোয়েস্ট পাঠায় এবং HTTP 400 (Bad Request) ত্রুটি প্রত্যাশা করে, কারণ name প্যারামিটার null

Step 4: Running the Tests

যেহেতু আমরা @SpringBootTest এবং MockMvc ব্যবহার করেছি, এখন আপনি এই টেস্টগুলি চালাতে পারেন JUnit বা Maven/Gradle ব্যবহার করে।

  • Maven এর মাধ্যমে টেস্ট চালাতে:
mvn test
  • JUnit প্লাগিনের মাধ্যমে IDE তে টেস্ট চালাতে।

Mockito এবং MockMvc এর মাধ্যমে Controller Testing এর সুবিধা:

  1. Easy Test Setup: MockMvc ব্যবহারের মাধ্যমে আপনি HTTP রিকোয়েস্ট এবং রেসপন্সের পরীক্ষা করতে পারেন, যা সরাসরি কন্ট্রোলারের কার্যকারিতা যাচাই করে।
  2. Separation of Concerns: কন্ট্রোলারের লজিক এবং সার্ভিসের মধ্যে পরিষ্কারভাবে আলাদা করা সম্ভব, যেহেতু Mockito সার্ভিস লেয়ার বা রেপোজিটরি মক করে এবং কন্ট্রোলারের সাথে ইন্টিগ্রেটেড টেস্ট করা হয়।
  3. Test for Real HTTP Request: MockMvc হল Spring MVC এর ইনবিল্ট টুল যা আপনার কন্ট্রোলার মেথডে আসল HTTP রিকোয়েস্ট প্রেরণ করে এবং প্রত্যাশিত রেসপন্স মেলানো যাচাই করে।
  4. Test Different Scenarios: আপনি বিভিন্ন ধরনের HTTP রিকোয়েস্ট প্যারামিটার (যেমন সঠিক, শূন্য, অথবা null) পরীক্ষা করতে পারেন।

উপসংহার:

Spring MVC তে Mockito এবং MockMvc ব্যবহার করে আপনি আপনার কন্ট্রোলারদের কার্যকারিতা অত্যন্ত সহজে এবং কার্যকরীভাবে টেস্ট করতে পারেন। MockMvc HTTP রিকোয়েস্টের মাধ্যমে কন্ট্রোলারের আউটপুট যাচাই করতে সাহায্য করে, এবং Mockito সার্ভিস বা রেপোজিটরি লেয়ারকে মক করে টেস্টকে আরও দ্রুত এবং নির্ভুল করতে সহায়ক হয়।

Content added By

উদাহরণ সহ Spring MVC Testing

128
128

Spring MVC অ্যাপ্লিকেশন পরীক্ষা করার জন্য Spring Test ফ্রেমওয়ার্কে কয়েকটি শক্তিশালী টুল এবং কৌশল রয়েছে। Spring MVC টেস্টিং মূলত @WebMvcTest, MockMvc, এবং @SpringBootTest ব্যবহার করে করা হয়। এই টেস্টিং টুলগুলির মাধ্যমে আপনি কন্ট্রোলার, রিকোয়েস্ট, রেসপন্স এবং অন্যান্য গুরুত্বপূর্ণ ফিচারগুলো সহজেই পরীক্ষা করতে পারেন।

এখানে, আমরা দেখবো কিভাবে Spring MVC অ্যাপ্লিকেশনে টেস্টিং করা যায়, বিশেষত কন্ট্রোলার টেস্ট করার জন্য।


1. MockMvc টেস্টিং

MockMvc Spring Test ফ্রেমওয়ার্কের একটি কমপ্যাক্ট টুল যা HTTP রিকোয়েস্ট এবং রেসপন্স প্রক্রিয়া পরীক্ষা করার জন্য ব্যবহৃত হয়। এটি অ্যাপ্লিকেশন কনটেক্সটে রিকোয়েস্ট পাঠানোর জন্য ব্যবহার করা হয়, কিন্তু ফ্যাক্টরী এবং সার্ভার রান করতে হয় না।

ধাপ 1: Dependency যোগ করা (Maven)

Spring MVC টেস্টিং এর জন্য আপনাকে spring-test এবং spring-boot-starter-test ডিপেন্ডেন্সি প্যাকেজ ইনস্টল করতে হবে।

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

ধাপ 2: Controller টেস্ট করা

ধরা যাক, আমাদের একটি HomeController রয়েছে যেটি /home URL তে রিকোয়েস্ট হ্যান্ডল করে।

@Controller
public class HomeController {

    @GetMapping("/home")
    public String home(Model model) {
        model.addAttribute("message", "Welcome to Spring MVC Testing!");
        return "home";
    }
}

এখন, আমরা এই কন্ট্রোলারের টেস্ট করব।

ধাপ 3: MockMvc টেস্ট কনফিগারেশন

Spring Test এর MockMvc ক্লাস ব্যবহার করে কন্ট্রোলার টেস্ট করা যাবে। নিচে একটি টেস্টের উদাহরণ দেওয়া হলো:

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;

@WebMvcTest(HomeController.class)
public class HomeControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void testHome() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.get("/home"))
               .andExpect(MockMvcResultMatchers.status().isOk())  // Check if status is 200 OK
               .andExpect(MockMvcResultMatchers.view().name("home")) // Check if view is 'home'
               .andExpect(MockMvcResultMatchers.model().attribute("message", "Welcome to Spring MVC Testing!")); // Check model attribute
    }
}

এখানে:

  • @WebMvcTest(HomeController.class): শুধুমাত্র HomeController কন্ট্রোলার টেস্ট করার জন্য এই অ্যানোটেশন ব্যবহার করা হয়েছে।
  • MockMvcRequestBuilders.get("/home"): HTTP GET রিকোয়েস্ট তৈরি করা হচ্ছে।
  • andExpect(MockMvcResultMatchers.status().isOk()): স্ট্যাটাস কোড 200 (OK) যাচাই করা হচ্ছে।
  • andExpect(MockMvcResultMatchers.view().name("home")): রেসপন্স ভিউ চেক করা হচ্ছে (এখানে "home" ভিউ আশা করা হচ্ছে)।
  • andExpect(MockMvcResultMatchers.model().attribute("message", "Welcome to Spring MVC Testing!")): মডেল অ্যাট্রিবিউট চেক করা হচ্ছে।

ধাপ 4: Run the Test

এখন আপনি @Test টেস্ট রান করলে HomeController এর /home URL এ রিকোয়েস্ট পাঠিয়ে সঠিক রেসপন্স এবং মডেল যাচাই করতে পারবেন।


2. Integration Testing with @SpringBootTest

যদি আপনি পুরো Spring Boot অ্যাপ্লিকেশনটি টেস্ট করতে চান, তবে @SpringBootTest ব্যবহার করতে পারেন। এটি সম্পূর্ণ অ্যাপ্লিকেশন কনটেক্সট লোড করে এবং রিয়েল HTTP রিকোয়েস্ট পাঠানোর মাধ্যমে টেস্ট করে।

ধাপ 1: Integration Test Example

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.client.TestRestTemplate;
import org.springframework.http.ResponseEntity;

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class HomeControllerIntegrationTest {

    @Autowired
    private TestRestTemplate restTemplate;

    @Test
    public void testHomeIntegration() {
        ResponseEntity<String> response = restTemplate.getForEntity("/home", String.class);
        
        // Assert the response status and content
        assert(response.getStatusCodeValue() == 200);
        assert(response.getBody().contains("Welcome to Spring MVC Testing!"));
    }
}

এখানে:

  • @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT): এটি Spring Boot অ্যাপ্লিকেশনকে ইন্টিগ্রেশন টেস্টের জন্য চালু করে এবং RANDOM_PORT ব্যবহার করে টেস্ট সার্ভার চালু করে।
  • TestRestTemplate: এটি Spring Boot অ্যাপ্লিকেশনের সাথে HTTP রিকোয়েস্ট পাঠানোর জন্য ব্যবহৃত হয়।
  • getForEntity("/home", String.class): এই কলটি /home URL থেকে রেসপন্স ফেরত আনবে এবং তার কন্টেন্ট চেক করবে।

ধাপ 2: Run the Integration Test

এখন আপনি ইন্টিগ্রেশন টেস্ট চালিয়ে দেখতে পারেন যে, আপনার Spring MVC অ্যাপ্লিকেশন কিভাবে কাজ করছে। এই ধরনের টেস্টিং ফিচারটি ইউজার ইন্টারফেস এবং রিয়েল সার্ভার ইন্টারঅ্যাকশন নিশ্চিত করার জন্য গুরুত্বপূর্ণ।


3. MockMvc এবং @WebMvcTest এর সুবিধা

  • উত্তরদায়ী এবং দ্রুত: MockMvc ব্যবহার করে শুধুমাত্র কন্ট্রোলার এবং রিকোয়েস্ট-রেসপন্স প্রক্রিয়া টেস্ট করা হয়, ফলে দ্রুত টেস্ট রান করা যায়।
  • ইউনিট টেস্ট: কন্ট্রোলারের লজিক নির্দিষ্ট করে পরীক্ষা করা যায়, যা ইউনিট টেস্ট হিসেবে ব্যবহৃত হয়।
  • ইন্টিগ্রেশন টেস্ট: @SpringBootTest ব্যবহারে পুরো Spring Boot অ্যাপ্লিকেশন টেস্ট করা যায়।

উপসংহার

Spring MVC অ্যাপ্লিকেশন টেস্টিং গুরুত্বপূর্ণ অংশ এবং MockMvc, @WebMvcTest, এবং @SpringBootTest ব্যবহার করে আপনি সহজে কন্ট্রোলার এবং সম্পূর্ণ অ্যাপ্লিকেশন টেস্ট করতে পারেন। এই টেস্টিং প্রযুক্তিগুলি আপনাকে দ্রুত, নির্ভুল এবং কার্যকর টেস্টিং করার সুযোগ দেয়, যা আপনাকে নিরাপদ ও স্থিতিশীল কোড প্রদান করতে সহায়ক।

Content added By
Promotion