Test your Controller's ModelAttribute methods.
20-January-2011
2 minutes read

I was about to write some unit tests around my Spring’s controller classes and also i wanted to write the test using MockHttpRequest and MockHttpResponse.

My controller had a method to which i was using ModelAttribute as one of the parameter. I just want to simulate the same scenario in my Unit Tests.

Unfortunately i could not see any methods in MockHttpRequest to help me with this. So i had to take a simple different approach as an workaround for this.

My Controller code looks similar to this:

@Controller @RequestMapping(value = "/register") public class MyController { @RequestMapping(value = "/save", method = RequestMethod.POST) public ModelAndView save(@ModelAttribute User user) { //Code to save the User object return new ModelAndView(); } }

My Unit Tests:

public class MyControllerTest { MockHttpServletResponse response; MockHttpServletRequest request; AnnotationMethodHandlerAdapter handler; @Before public final void init() { response = new MockHttpServletResponse(); request = new MockHttpServletRequest(); handler = new AnnotationMethodHandlerAdapter(); } @Test public void shouldTestSaveUser() { final User mockUser = new UserTestBuilder().withName("John").build(); request.setMethod("POST"); request.setRequestURI("/register/save"); MyController myController = new MyController() { @ModelAttribute public User mockModel() { return user; } } ModelAndView model = handler.handle(request, response, myController); } }

Explanation:

Whenever a method in a controller is annotated with @ModelAttribute , it will be invoked for every request made to that controller. So while creating the mycontroller object i am overriding a sample method which has this annotation and returns a User object as a ModelAttribute.

Share
Like
profile-image
Prasanna is a full stack web developer, with exposure to various programming languages. Uses mostly Java, Javascript these days and got ~13 years of architecting and coding enterprise software solutions.