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
}
}
ব্যাখ্যা:
MockMvcsetup:@Autowired WebApplicationContextএবংMockMvcBuildersব্যবহার করে আমরাMockMvcসেটআপ করেছি।- Test 1:
testGreetWithValidName: এটি/greet?name=JohnURL এ GET রিকোয়েস্ট পাঠায় এবংHello, John!রেসপন্স আশা করে। যদিnameপ্যারামিটার সঠিক থাকে, তবে HTTP 200 স্ট্যাটাস কোড এবং সঠিক কন্টেন্ট ফিরিয়ে আসবে। - Test 2:
testGreetWithEmptyName: এটি/greet?name=URL এ GET রিকোয়েস্ট পাঠায় এবং প্রত্যাশা করে যে এটি HTTP 400 (Bad Request) ত্রুটি ফেরত দেবে, কারণnameপ্যারামিটার শূন্য। - Test 3:
testGreetWithNullName: এটি/greet?name=nullURL এ 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 এর সুবিধা:
- Easy Test Setup:
MockMvcব্যবহারের মাধ্যমে আপনি HTTP রিকোয়েস্ট এবং রেসপন্সের পরীক্ষা করতে পারেন, যা সরাসরি কন্ট্রোলারের কার্যকারিতা যাচাই করে। - Separation of Concerns: কন্ট্রোলারের লজিক এবং সার্ভিসের মধ্যে পরিষ্কারভাবে আলাদা করা সম্ভব, যেহেতু
Mockitoসার্ভিস লেয়ার বা রেপোজিটরি মক করে এবং কন্ট্রোলারের সাথে ইন্টিগ্রেটেড টেস্ট করা হয়। - Test for Real HTTP Request:
MockMvcহল Spring MVC এর ইনবিল্ট টুল যা আপনার কন্ট্রোলার মেথডে আসল HTTP রিকোয়েস্ট প্রেরণ করে এবং প্রত্যাশিত রেসপন্স মেলানো যাচাই করে। - Test Different Scenarios: আপনি বিভিন্ন ধরনের HTTP রিকোয়েস্ট প্যারামিটার (যেমন সঠিক, শূন্য, অথবা
null) পরীক্ষা করতে পারেন।
উপসংহার:
Spring MVC তে Mockito এবং MockMvc ব্যবহার করে আপনি আপনার কন্ট্রোলারদের কার্যকারিতা অত্যন্ত সহজে এবং কার্যকরীভাবে টেস্ট করতে পারেন। MockMvc HTTP রিকোয়েস্টের মাধ্যমে কন্ট্রোলারের আউটপুট যাচাই করতে সাহায্য করে, এবং Mockito সার্ভিস বা রেপোজিটরি লেয়ারকে মক করে টেস্টকে আরও দ্রুত এবং নির্ভুল করতে সহায়ক হয়।