Spring Boot Testing - WebMvcTest

Use @WebMvcTest. Narrow the tests to only the web layer.

With this approach, Spring Boot instantiates only the web layer rather than the whole context. In an application with multiple controllers, you can even ask for only one to be instantiated by using, for example, @WebMvcTest(HomeController.class)

import static org.hamcrest.Matchers.containsString;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

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;

@WebMvcTest
public class WebLayerTest {

   @Autowired
   private MockMvc mockMvc;

   @Test
   public void shouldReturnDefaultMessage() throws Exception {
           this.mockMvc
               .perform(get("/"))
               .andDo(print())
               .andExpect(status().isOk())
               .andExpect(content().string(containsString("Hello, World")));
   }
}

@WebMvcTest with MockBeans for service classes

What if the Controllers use service classes?

Use @MockBean to create and inject a mock for the GreetingService (if you do not do so, the application context cannot start), and we set its expectations using Mockito.

import static org.hamcrest.Matchers.containsString;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

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.boot.test.mock.mockito.MockBean;
import org.springframework.test.web.servlet.MockMvc;

import com.example.weblayertestingforspringbootapp.controller.GreetingController;
import com.example.weblayertestingforspringbootapp.service.GreetingService;

@WebMvcTest(GreetingController.class)
public class WebMockTest {

   @Autowired
   private MockMvc mockMvc;

   @MockBean
   private GreetingService service;

   @Test
   public void greetingShouldReturnMessageFromService() throws Exception {
           when(service.greet()).thenReturn("Hello, Mock");
           this.mockMvc
               .perform(get("/greeting"))
               .andDo(print())
               .andExpect(status().isOk())
               .andExpect(content().string(containsString("Hello, Mock")));
   }
}

Reference

https://spring.io/guides/gs/testing-web