Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to test a spring controller method by using MockMvc?

Tags:

I'm using spring 3.2.0 and junit 4

This is my controller method which I need to test

@RequestMapping(value="Home") public ModelAndView returnHome(){  return new ModelAndView("Home");     } 

spring-servlet config is:

<context:annotation-config/>     <context:component-scan base-package="com.spring.poc" />     <mvc:annotation-driven />       <bean id="jspViewResolver"     class="org.springframework.web.servlet.view.InternalResourceViewResolver">     <property name="viewClass"         value="org.springframework.web.servlet.view.JstlView" />     <property name="prefix" value="/WEB-INF/jsp/" />     <property name="suffix" value=".jsp" /> 

This is my test class :

public class TestController {  private MockMvc mockMvc;  @Before public void setup() {     InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();     viewResolver.setPrefix("/WEB-INF/");     viewResolver.setSuffix(".jsp");     this.mockMvc = standaloneSetup(new CController()).setViewResolvers(             viewResolver).build(); }  @Test public void CControllerTest() throws Exception {     ......     ......       } 

}

How can I test this method with MockMvc ?

like image 913
JToddler Avatar asked Jan 28 '13 13:01

JToddler


People also ask

How do you write a test case for a spring rest controller?

Writing a Unit Test for REST Controller First, we need to create Abstract class file used to create web application context by using MockMvc and define the mapToJson() and mapFromJson() methods to convert the Java object into JSON string and convert the JSON string into Java object.

Why do we use MockMvc?

MockMvc provides support for Spring MVC testing. It encapsulates all web application beans and makes them available for testing. We'll initialize the mockMvc object in the @BeforeEach annotated method, so that we don't have to initialize it inside every test.


1 Answers

You can use your applications dispatcher servlet xml using the following annoations. The following example is hitting a controller with the path /mysessiontest setting some session attributes and expecting a certain view to be returned:

import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpSession; 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.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext;  import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;  @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration({ "classpath:springDispatcher-servlet.xml" })  public class MySessionControllerTest {      @Autowired WebApplicationContext wac;      @Autowired MockHttpSession session;     @Autowired MockHttpServletRequest request;      private MockMvc mockMvc;      @Before     public void setup() {         this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();     }      @Test     public void getAccount() throws Exception {         UserDomain user = new UserDomain();         user.setFirstName("johnny");          session.setAttribute("sessionParm",user);         this.mockMvc.perform(get("/mysessiontest").session(session)         .accept(MediaType.TEXT_HTML))         .andExpect(status().isOk())         .andExpect(view().name("test"));     } } 
like image 148
Manuel Quinones Avatar answered Oct 11 '22 15:10

Manuel Quinones