From 6fb230546db624ebf906486d32fe5117691cacef Mon Sep 17 00:00:00 2001 From: Sunil Gulabani Date: Mon, 1 Aug 2016 16:44:57 +0530 Subject: [PATCH] Integration Testing with Spring MVC. --- pom.xml | 1 + spring-mvc-test/README | 5 + spring-mvc-test/pom.xml | 193 ++++++++++++++++++ .../baeldung/spring/ApplicationConfig.java | 36 ++++ .../com/baeldung/spring/bean/Greeting.java | 19 ++ .../spring/controller/GreetController.java | 64 ++++++ .../src/main/resources/logback.xml | 18 ++ .../src/main/webapp/WEB-INF/jsp/index.jsp | 5 + .../main/webapp/WEB-INF/spring-servlet.xml | 5 + .../src/main/webapp/WEB-INF/web.xml | 34 +++ .../GreetControllerIntegrationTest.java | 114 +++++++++++ .../controller/GreetControllerTest.java | 83 ++++++++ 12 files changed, 577 insertions(+) create mode 100644 spring-mvc-test/README create mode 100644 spring-mvc-test/pom.xml create mode 100644 spring-mvc-test/src/main/java/com/baeldung/spring/ApplicationConfig.java create mode 100644 spring-mvc-test/src/main/java/com/baeldung/spring/bean/Greeting.java create mode 100644 spring-mvc-test/src/main/java/com/baeldung/spring/controller/GreetController.java create mode 100644 spring-mvc-test/src/main/resources/logback.xml create mode 100644 spring-mvc-test/src/main/webapp/WEB-INF/jsp/index.jsp create mode 100644 spring-mvc-test/src/main/webapp/WEB-INF/spring-servlet.xml create mode 100644 spring-mvc-test/src/main/webapp/WEB-INF/web.xml create mode 100644 spring-mvc-test/src/test/java/com/baeldung/spring/controller/GreetControllerIntegrationTest.java create mode 100644 spring-mvc-test/src/test/java/com/baeldung/spring/controller/GreetControllerTest.java diff --git a/pom.xml b/pom.xml index 62d3d03633..c32ee82ce1 100644 --- a/pom.xml +++ b/pom.xml @@ -107,6 +107,7 @@ mutation-testing spring-mvc-velocity xstream + spring-mvc-test diff --git a/spring-mvc-test/README b/spring-mvc-test/README new file mode 100644 index 0000000000..9f4a0a60d4 --- /dev/null +++ b/spring-mvc-test/README @@ -0,0 +1,5 @@ +To compile and run the project, execute following command: + + mvn clean install org.codehaus.cargo:cargo-maven2-plugin:run + +URL: http://localhost:8080/spring-mvc-test/ diff --git a/spring-mvc-test/pom.xml b/spring-mvc-test/pom.xml new file mode 100644 index 0000000000..3c4875f087 --- /dev/null +++ b/spring-mvc-test/pom.xml @@ -0,0 +1,193 @@ + + 4.0.0 + com.baeldung + spring-mvc-test + 0.1-SNAPSHOT + spring-mvc-test + war + + + + 4.3.1.RELEASE + + 1.7.21 + 1.1.7 + + 3.4 + + 1.3 + 4.12 + 1.10.19 + 4.4.5 + 4.5.2 + + + 3.5.1 + 2.6 + 2.19.1 + 2.19.1 + 3.0.1 + + + 1.5.0 + + + + + + + org.springframework + spring-web + ${org.springframework.version} + + + org.springframework + spring-webmvc + ${org.springframework.version} + + + org.springframework + spring-websocket + ${org.springframework.version} + + + + com.fasterxml.jackson.core + jackson-core + 2.7.3 + + + com.fasterxml.jackson.core + jackson-databind + 2.7.3 + + + + javax.servlet + javax.servlet-api + 3.0.1 + provided + + + javax.servlet + jstl + 1.2 + runtime + + + + org.slf4j + slf4j-api + ${org.slf4j.version} + + + org.slf4j + slf4j-log4j12 + ${org.slf4j.version} + + + + junit + junit + ${junit.version} + test + + + org.mockito + mockito-core + ${mockito.version} + test + + + com.jayway.jsonpath + json-path + 2.2.0 + + + org.springframework + spring-test + ${org.springframework.version} + test + + + + + spring-mvc-test + + + src/main/resources + true + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + + + + + maven-resources-plugin + 2.7 + + + + org.apache.maven.plugins + maven-war-plugin + ${maven-war-plugin.version} + + false + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + **/*IntegrationTest.java + + + + + org.apache.maven.plugins + maven-failsafe-plugin + ${maven-failsafe-plugin.version} + + + **/*IntegrationTest.java + + + + + + integration-test + verify + + + + + + org.codehaus.cargo + cargo-maven2-plugin + ${cargo-maven2-plugin.version} + + + jetty8x + embedded + + + + 8080 + + + + + + + \ No newline at end of file diff --git a/spring-mvc-test/src/main/java/com/baeldung/spring/ApplicationConfig.java b/spring-mvc-test/src/main/java/com/baeldung/spring/ApplicationConfig.java new file mode 100644 index 0000000000..1a5b590854 --- /dev/null +++ b/spring-mvc-test/src/main/java/com/baeldung/spring/ApplicationConfig.java @@ -0,0 +1,36 @@ +package com.baeldung.spring; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.ViewResolver; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import org.springframework.web.servlet.view.InternalResourceViewResolver; +import org.springframework.web.servlet.view.JstlView; + +@EnableWebMvc +@Configuration +@ComponentScan(basePackages = {"com.baeldung.spring.controller"}) +public class ApplicationConfig extends WebMvcConfigurerAdapter { + + public ApplicationConfig() { + super(); + } + + @Override + public void addViewControllers(final ViewControllerRegistry registry) { + super.addViewControllers(registry); + registry.addViewController("/").setViewName("index"); + } + + @Bean + public ViewResolver viewResolver() { + final InternalResourceViewResolver bean = new InternalResourceViewResolver(); + bean.setViewClass(JstlView.class); + bean.setPrefix("/WEB-INF/jsp/"); + bean.setSuffix(".jsp"); + return bean; + } +} \ No newline at end of file diff --git a/spring-mvc-test/src/main/java/com/baeldung/spring/bean/Greeting.java b/spring-mvc-test/src/main/java/com/baeldung/spring/bean/Greeting.java new file mode 100644 index 0000000000..d7ddaf2fd1 --- /dev/null +++ b/spring-mvc-test/src/main/java/com/baeldung/spring/bean/Greeting.java @@ -0,0 +1,19 @@ +package com.baeldung.spring.bean; + +public class Greeting { + private int id; + private String message; + + public int getId() { + return id; + } + public void setId(int id) { + this.id = id; + } + public String getMessage() { + return message; + } + public void setMessage(String message) { + this.message = message; + } +} diff --git a/spring-mvc-test/src/main/java/com/baeldung/spring/controller/GreetController.java b/spring-mvc-test/src/main/java/com/baeldung/spring/controller/GreetController.java new file mode 100644 index 0000000000..0f62df2a71 --- /dev/null +++ b/spring-mvc-test/src/main/java/com/baeldung/spring/controller/GreetController.java @@ -0,0 +1,64 @@ +package com.baeldung.spring.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.baeldung.spring.bean.Greeting; + +@Controller +public class GreetController { + + @RequestMapping(value = "/homePage", method = RequestMethod.GET) + public String index() { + return "index"; + } + + @RequestMapping(value = "/greet", method = RequestMethod.GET, produces = "application/json") + @ResponseBody + public Greeting greet() { + Greeting greeting = new Greeting(); + greeting.setId(1); + greeting.setMessage("Hello World!!!"); + return greeting; + } + + @RequestMapping(value = "/greetWithPathVariable/{name}", method = RequestMethod.GET, produces = "application/json") + @ResponseBody + public Greeting greetWithPathVariable(@PathVariable("name") String name) { + Greeting greeting = new Greeting(); + greeting.setId(1); + greeting.setMessage("Hello World " + name + "!!!"); + return greeting; + } + + @RequestMapping(value = "/greetWithQueryVariable", method = RequestMethod.GET, produces = "application/json") + @ResponseBody + public Greeting greetWithQueryVariable(@RequestParam("name") String name) { + Greeting greeting = new Greeting(); + greeting.setId(1); + greeting.setMessage("Hello World " + name + "!!!"); + return greeting; + } + + @RequestMapping(value = "/greetWithPost", method = RequestMethod.POST, produces = "application/json") + @ResponseBody + public Greeting greetWithPost() { + Greeting greeting = new Greeting(); + greeting.setId(1); + greeting.setMessage("Hello World!!!"); + return greeting; + } + + @RequestMapping(value = "/greetWithPostAndFormData", method = RequestMethod.POST, produces = "application/json") + @ResponseBody + public Greeting greetWithPostAndFormData(@RequestParam("id") int id, @RequestParam("name") String name) { + Greeting greeting = new Greeting(); + greeting.setId(id); + greeting.setMessage("Hello World " + name + "!!!"); + return greeting; + } +} \ No newline at end of file diff --git a/spring-mvc-test/src/main/resources/logback.xml b/spring-mvc-test/src/main/resources/logback.xml new file mode 100644 index 0000000000..166c369905 --- /dev/null +++ b/spring-mvc-test/src/main/resources/logback.xml @@ -0,0 +1,18 @@ + + + + web - %date [%thread] %-5level %logger{36} - %message%n + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-mvc-test/src/main/webapp/WEB-INF/jsp/index.jsp b/spring-mvc-test/src/main/webapp/WEB-INF/jsp/index.jsp new file mode 100644 index 0000000000..89c7ca6c81 --- /dev/null +++ b/spring-mvc-test/src/main/webapp/WEB-INF/jsp/index.jsp @@ -0,0 +1,5 @@ + + +

Spring MVC - Integration Testing

+ + \ No newline at end of file diff --git a/spring-mvc-test/src/main/webapp/WEB-INF/spring-servlet.xml b/spring-mvc-test/src/main/webapp/WEB-INF/spring-servlet.xml new file mode 100644 index 0000000000..40718ab3a4 --- /dev/null +++ b/spring-mvc-test/src/main/webapp/WEB-INF/spring-servlet.xml @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/spring-mvc-test/src/main/webapp/WEB-INF/web.xml b/spring-mvc-test/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000..8cf7a9a37b --- /dev/null +++ b/spring-mvc-test/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,34 @@ + + + + Spring MVC - Integration Testing + + + contextClass + + org.springframework.web.context.support.AnnotationConfigWebApplicationContext + + + + contextConfigLocation + com.baeldung.spring + + + + org.springframework.web.context.ContextLoaderListener + + + + spring + org.springframework.web.servlet.DispatcherServlet + 1 + + + + spring + / + + \ No newline at end of file diff --git a/spring-mvc-test/src/test/java/com/baeldung/spring/controller/GreetControllerIntegrationTest.java b/spring-mvc-test/src/test/java/com/baeldung/spring/controller/GreetControllerIntegrationTest.java new file mode 100644 index 0000000000..d7d697dda9 --- /dev/null +++ b/spring-mvc-test/src/test/java/com/baeldung/spring/controller/GreetControllerIntegrationTest.java @@ -0,0 +1,114 @@ +package com.baeldung.spring.controller; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mock.web.MockServletContext; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; + +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import org.springframework.web.context.WebApplicationContext; + +import com.baeldung.spring.ApplicationConfig; + +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; + +import javax.servlet.ServletContext; + +@RunWith(SpringJUnit4ClassRunner.class) +@WebAppConfiguration +@ContextConfiguration(classes = { ApplicationConfig.class }) +public class GreetControllerIntegrationTest { + + @Autowired + private WebApplicationContext wac; + + private MockMvc mockMvc; + + @Before + public void setup() throws Exception { + this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac) +// .alwaysExpect(MockMvcResultMatchers.status().isOk()) + .build(); + } + + @Test + public void verifyWac() { + ServletContext servletContext = wac.getServletContext(); + Assert.assertNotNull(servletContext); + Assert.assertTrue(servletContext instanceof MockServletContext); + Assert.assertNotNull(wac.getBean("greetController")); + } + + @Test + public void verifyIndexJspViewName() throws Exception { + this.mockMvc + .perform(MockMvcRequestBuilders.get("/homePage")) + .andDo(print()) + .andExpect(MockMvcResultMatchers.view().name("index")); + } + + @Test + public void verifyGreet() throws Exception { + MvcResult mvcResult = this.mockMvc + .perform(MockMvcRequestBuilders.get("/greet")) + .andDo(print()) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.jsonPath("$.message").value("Hello World!!!")) + .andReturn(); + Assert.assertEquals("application/json;charset=UTF-8", mvcResult.getResponse().getContentType()); + } + + @Test + public void verifyGreetWithPathVariable() throws Exception { + this.mockMvc.perform(MockMvcRequestBuilders.get("/greetWithPathVariable/John")).andDo(print()).andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.content().contentType("application/json;charset=UTF-8")) + .andExpect(MockMvcResultMatchers.jsonPath("$.message").value("Hello World John!!!")); + } + + @Test + public void verifyGreetWithPathVariable_2() throws Exception { + this.mockMvc + .perform(MockMvcRequestBuilders.get("/greetWithPathVariable/{name}", "Doe")) + .andDo(print()) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.content().contentType("application/json;charset=UTF-8")) + .andExpect(MockMvcResultMatchers.jsonPath("$.message").value("Hello World Doe!!!")); + } + + @Test + public void verifyGreetWithQueryVariable() throws Exception { + this.mockMvc + .perform(MockMvcRequestBuilders.get("/greetWithQueryVariable").param("name", "John Doe")) + .andDo(print()) + .andExpect(MockMvcResultMatchers.status().isOk()).andExpect(MockMvcResultMatchers.content().contentType("application/json;charset=UTF-8")) + .andExpect(MockMvcResultMatchers.jsonPath("$.message").value("Hello World John Doe!!!")); + } + + @Test + public void verifyGreetWithPost() throws Exception { + this.mockMvc + .perform(MockMvcRequestBuilders.post("/greetWithPost")) + .andDo(print()) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.content().contentType("application/json;charset=UTF-8")) + .andExpect(MockMvcResultMatchers.jsonPath("$.message").value("Hello World!!!")); + } + + @Test + public void verifyGreetWithPostAndFormData() throws Exception { + this.mockMvc + .perform(MockMvcRequestBuilders.post("/greetWithPostAndFormData").param("id", "1").param("name", "John Doe")) + .andDo(print()).andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.content().contentType("application/json;charset=UTF-8")) + .andExpect(MockMvcResultMatchers.jsonPath("$.message").value("Hello World John Doe!!!")).andExpect(MockMvcResultMatchers.jsonPath("$.id").value(1)); + } +} \ No newline at end of file diff --git a/spring-mvc-test/src/test/java/com/baeldung/spring/controller/GreetControllerTest.java b/spring-mvc-test/src/test/java/com/baeldung/spring/controller/GreetControllerTest.java new file mode 100644 index 0000000000..155b6b4a50 --- /dev/null +++ b/spring-mvc-test/src/test/java/com/baeldung/spring/controller/GreetControllerTest.java @@ -0,0 +1,83 @@ +package com.baeldung.spring.controller; + +import org.junit.Before; +import org.junit.Test; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; + +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.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; + +public class GreetControllerTest { + + private MockMvc mockMvc; + + @Before + public void setup() { + this.mockMvc = MockMvcBuilders.standaloneSetup(new GreetController()).build(); + } + + @Test + public void verifyIndexJspViewName() throws Exception { + this.mockMvc.perform(get("/homePage")) + .andExpect(view().name("index")); + } + + @Test + public void verifyGreet() throws Exception { + this.mockMvc.perform(get("/greet")) + .andExpect(status().isOk()) + .andExpect(content().contentType("application/json;charset=UTF-8")) + .andExpect(jsonPath("$.message").value("Hello World!!!")); + } + + @Test + public void verifyGreetWithPathVariable() throws Exception { + this.mockMvc.perform(get("/greetWithPathVariable/John")) + .andExpect(status().isOk()) + .andExpect(content().contentType("application/json;charset=UTF-8")) + .andExpect(jsonPath("$.message").value("Hello World John!!!")); + } + + @Test + public void verifyGreetWithPathVariable_2() throws Exception { + this.mockMvc.perform(get("/greetWithPathVariable/{name}","Doe")) + .andExpect(status().isOk()) + .andExpect(content().contentType("application/json;charset=UTF-8")) + .andExpect(jsonPath("$.message").value("Hello World Doe!!!")); + } + + @Test + public void verifyGreetWithQueryVariable() throws Exception { + this.mockMvc + .perform(MockMvcRequestBuilders.get("/greetWithQueryVariable").param("name", "John Doe")) + .andDo(print()) + .andExpect(MockMvcResultMatchers.status().isOk()).andExpect(MockMvcResultMatchers.content().contentType("application/json;charset=UTF-8")) + .andExpect(MockMvcResultMatchers.jsonPath("$.message").value("Hello World John Doe!!!")); + } + + @Test + public void verifyGreetWithPost() throws Exception { + this.mockMvc + .perform(MockMvcRequestBuilders.post("/greetWithPost")) + .andDo(print()) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.content().contentType("application/json;charset=UTF-8")) + .andExpect(MockMvcResultMatchers.jsonPath("$.message").value("Hello World!!!")); + } + + @Test + public void verifyGreetWithPostAndFormData() throws Exception { + this.mockMvc + .perform(MockMvcRequestBuilders.post("/greetWithPostAndFormData").param("id", "1").param("name", "John Doe")) + .andDo(print()).andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.content().contentType("application/json;charset=UTF-8")) + .andExpect(MockMvcResultMatchers.jsonPath("$.message").value("Hello World John Doe!!!")).andExpect(MockMvcResultMatchers.jsonPath("$.id").value(1)); + } +}