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));
+ }
+}