Automated testing plays a vital role in the software industry. In this article, let us see how to do the testing using MockMvc for a Spring Boot project. To test the web layer, we need MockMvc and by using @AutoConfigureMockMvc, we can write tests that will get injected. SpringBootApplication is an excellent one that adds the following
- @Configuration
- @EnableAutoConfiguration
- @EnableWebMvc
- @ComponentScan
The application can ordinarily run as a Java application and hence development wise it is easier. Let’s see the concept via a sample project
Example Project
Project Structure:
As it is a maven project, all dependencies are available under
pom.xml
Dependencies like
- JDK 1.8
- Spring version from 2.2.5 onwards
- Maven 3.2+ and in the case of Gradle, it is Gradle 4+
We should add all the dependencies in pom.xml(in the case of the Maven project)
XML
<? xml version = "1.0" encoding = "UTF-8" ?> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 < modelVersion >4.0.0</ modelVersion > < groupId >com.gfg.sample</ groupId > < artifactId >sampleboot-unit-testing-with-mock-mvc</ artifactId > < version >1.0-SNAPSHOT</ version > < parent > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-parent</ artifactId > <!-- Mandatory --> < version >2.2.5.RELEASE</ version > </ parent > < properties > < java.version >1.8</ java.version > </ properties > < dependencies > < dependency > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-web</ artifactId > </ dependency > < dependency > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-test</ artifactId > </ dependency > </ dependencies > </ project > |
We are using MockMvc to test the web layer. That is we should have a model. a controller, and a view. Let us see the controller file
WelcomeMvcController.java
Each and every method should have either Getmapping or Postmapping
Java
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @Controller public class WelcomeMvcController { @Autowired private WelcomeService welcomeService; @GetMapping (value = "/" ) public String greeting1(String name, Model model) { model.addAttribute( "welcome" , welcomeService.greetingMessage1(name)); return "welcome-page" ; } @GetMapping (value = "/event" ) public String greeting2(String name, Model model) { model.addAttribute( "welcomeToEvent" , welcomeService.greetingMessage2(name)); return "event-page" ; } } |
Required services are written in the service file
WelcomeService.java
Java
import org.springframework.stereotype.Service; @Service public class WelcomeService { public String greetingMessage1(String name) { return String.format( "Welcome , %s to the world of programming!!!" , name ); } public String greetingMessage2(String attendee) { return String.format( "Welldone , %s You are selected to the contest!!!" , attendee ); } } |
SpringBoot Application is run as an ordinary Java application only
WebAppMain.java
Java
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class WebAppMain { public static void main(String[] args) { SpringApplication.run(WebAppMain. class , args); } } |
Now let us start to write the test class that tests the web layer by using MockMvc
WelcomeWebAppTest.java
Java
import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultHandlers; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; @RunWith (SpringRunner. class ) @SpringBootTest @AutoConfigureMockMvc public class WelcomeWebAppTest { @Autowired private MockMvc mockMvc; @Test // We have to write out expectations and the // expectations need to match with actuals // When this is run, it imitates and accesses // the web layer and get the output. public void testWelcome() throws Exception { this .mockMvc.perform(MockMvcRequestBuilders.get( "/" ).param( "name" , "Geeks" )) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.model().attribute( "welcome" , "Welcome , Geeks to the world of programming!!!" )) .andExpect(MockMvcResultMatchers.view().name( "welcome-page" )) .andDo(MockMvcResultHandlers.print()); } @Test public void testWelcomeToEvent() throws Exception { this .mockMvc.perform(MockMvcRequestBuilders.get( "/event" ).param( "name" , "Geeks" )) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.model().attribute( "welcomeToEvent" , "Welldone , Geeks You are selected to the contest!!!" )) .andExpect(MockMvcResultMatchers.view().name( "event-page" )) .andDo(MockMvcResultHandlers.print()); } } |
Once the project is complete and does not contain any errors, we can run the test file as an ordinary JUNIT application
Console Output:
Once we are getting response 200 means the service is available and the parameters are passed properly and it is producing a positive response. With that response, we are comparing the details by means of
Java
this .mockMvc.perform(MockMvcRequestBuilders.get( "/" ).param( "name" , "Geeks" )) .andExpect(MockMvcResultMatchers.status().isOk()) // checking status .andExpect(MockMvcResultMatchers.model().attribute( "welcome" , "Welcome , Geeks to the world of programming!!!" )) // sent attribute and its value check .andExpect(MockMvcResultMatchers.view().name( "welcome-page" )) // its view name check .andDo(MockMvcResultHandlers.print()); |
Like this, we can test the web layer in the above-said ways
Conclusion
Automated testing helps to avoid tons of errors and error-free code and helps for good quality software. In the Spring Boot project, we can use MockMvc and can achieve the same.