diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/result/HandlerResultMatchers.java b/spring-test/src/main/java/org/springframework/test/web/servlet/result/HandlerResultMatchers.java index e1b0b6e500012f00143e4fbf9d5f1e61ba6b233c..591eeb8cb201d8ad3190110e98696cbe60b7f316 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/result/HandlerResultMatchers.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/result/HandlerResultMatchers.java @@ -24,6 +24,7 @@ import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.ResultMatcher; import org.springframework.util.ClassUtils; import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; @@ -73,6 +74,38 @@ public class HandlerResultMatchers { }; } + /** + * Assert the controller method used to process the request. The expected + * method is specified through a "mock" controller method invocation + * similar to {@link MvcUriComponentsBuilder#fromMethodCall(Object)}. + *

For example given this controller: + *

+	 * @RestController
+	 * static class SimpleController {
+	 *
+	 *     @RequestMapping("/")
+	 *     public ResponseEntity handle() {
+	 *         return ResponseEntity.ok().build();
+	 *     }
+	 * }
+	 * 
+ *

A test can be performed: + *

+	 * mockMvc.perform(get("/"))
+	 *     .andExpect(handler().methodCall(on(SimpleController.class).handle()));
+	 * 
+ */ + public ResultMatcher methodCall(final Object info) { + return new ResultMatcher() { + @Override + public void match(MvcResult result) throws Exception { + HandlerMethod handlerMethod = getHandlerMethod(result); + Method method = ((MvcUriComponentsBuilder.MethodInvocationInfo) info).getControllerMethod(); + assertEquals("HandlerMethod", method, handlerMethod.getMethod()); + } + }; + } + /** * Assert the name of the controller method used to process the request * using the given Hamcrest {@link Matcher}. diff --git a/spring-test/src/test/java/org/springframework/test/web/servlet/samples/standalone/resultmatchers/HandlerAssertionTests.java b/spring-test/src/test/java/org/springframework/test/web/servlet/samples/standalone/resultmatchers/HandlerAssertionTests.java index 364fa70e339f0cc6f17ebaac51681cbe8df00ed7..902df20a2bd5569fe8d95e0f90d618955d662e3c 100644 --- a/spring-test/src/test/java/org/springframework/test/web/servlet/samples/standalone/resultmatchers/HandlerAssertionTests.java +++ b/spring-test/src/test/java/org/springframework/test/web/servlet/samples/standalone/resultmatchers/HandlerAssertionTests.java @@ -21,17 +21,19 @@ import java.lang.reflect.Method; import org.junit.Before; import org.junit.Test; -import org.springframework.http.HttpEntity; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.test.web.servlet.MockMvc; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; -import static org.hamcrest.Matchers.*; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; -import static org.springframework.test.web.servlet.setup.MockMvcBuilders.*; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.not; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.handler; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.setup.MockMvcBuilders.standaloneSetup; import static org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder.on; /** @@ -53,6 +55,11 @@ public class HandlerAssertionTests { this.mockMvc.perform(get("/")).andExpect(handler().handlerType(SimpleController.class)); } + @Test + public void testMethodCall() throws Exception { + this.mockMvc.perform(get("/")).andExpect(handler().methodCall(on(SimpleController.class).handle())); + } + @Test public void testHandlerMethodNameEqualTo() throws Exception { this.mockMvc.perform(get("/")).andExpect(handler().methodName("handle"));