2014-02-24 81 views
1

我使用spring-test-mvc(standalone),因爲我的應用程序使用spring 3.1運行。我基本上只是試圖測試我的控制器方法和響應HTTP代碼。Spring-Test-Mvc控制器測試

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration 
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class}) 
public class AdminSpringControllerTests { 
    private AdminSpringController cut; 
    private MockMvc mockMvc; 
    public AdminSpringControllerTests() { 

     cut = new AdminSpringController(); 
     this.mockMvc = MockMvcBuilders.standaloneSetup(cut).build(); 
    } 
    @Test 
    public void testGetUsers_Sc200_1() throws Exception{ 

     List<User> users = new ArrayList<User>(); 
     for (int i = 1; i<3; i++) { 
      User user = new User(); 
      user.setId(i); 
      user.setUserId("test"+i); 
      user.setName("Max Testermann"); 

      users.add(user); 
     } 

     EasyMock.expect(cut.userService.getUsers()).andReturn(users); 
     EasyMock.replay(); 

     MockHttpServletRequestBuilder request = MockMvcRequestBuilders.get("/user"); 

     this.mockMvc.perform(request).andExpect(MockMvcResultMatchers.status().isOk()); 

     EasyMock.verify(cut); 

    } 
} 

但我發現了一個的NoSuchMethodError

java.lang.NoSuchMethodError: org.springframework.web.servlet.FlashMapManager.saveOutputFlashMap(Lorg/springframework/web/servlet/FlashMap;Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V 
    at org.springframework.test.web.server.request.MockHttpServletRequestBuilder.buildRequest(MockHttpServletRequestBuilder.java:605) 
    at org.springframework.test.web.server.MockMvc.perform(MockMvc.java:125) 
    at com.prime_sign.admin.web.controller.AdminSpringControllerTests.testGetUsers_Sc200_1(AdminSpringControllerTests.java:98) 

是否有必要@Autowire我的控制器?我的構造函數是錯的嗎? 在src/test/resources /「package-path」/AdminSpringControllerTests-context.xml中有一個上下文文件,但它只包含<context:annotation-config /><tx:annotation-driven />,我必須在那裏注入我的控制器bean(問題1,是否有必要)。

THX任何幫助:)

//編輯

我更新了我的代碼:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration 
public class AdminSpringControllerTests { 

    private MockMvc mockMvc; 

    @Autowired 
    private WebApplicationContext wac; 

    public AdminSpringControllerTests() { 
     this.mockMvc = MockMvcBuilders.webApplicationContextSetup(this.wac).build(); 
    } 

    @Test 
    public void testGetUsers_Sc200_1() throws Exception{ 

     List<User> users = new ArrayList<User>(); 
     for (int i = 1; i<3; i++) { 
      User user = new User(); 
      user.setId(i); 
      user.setUserId("test"+i); 
      user.setName("Max Testermann"); 

      users.add(user); 
     } 

     EasyMock.expect(cut.userService.getUsers()).andReturn(users); 
     EasyMock.replay(); 

     MockHttpServletRequestBuilder request = MockMvcRequestBuilders.get("/user").accept(MediaType.APPLICATION_JSON); 

     this.mockMvc.perform(request).andDo(print()).andExpect(MockMvcResultMatchers.status().isOk()); 

     EasyMock.verify(cut); 

    } 
} 

但是知道我有(我認爲)這個問題,我沒有得到WebApplicationContext的權利:

java.lang.IllegalArgumentException: WebApplicationContext is required 
    at org.springframework.util.Assert.notNull(Assert.java:112) 
    at org.springframework.test.web.server.setup.InitializedContextMockMvcBuilder.<init>(InitializedContextMockMvcBuilder.java:39) 
+1

根本原因是春天的版本問題。發佈您使用的每個彈簧罐的版本。 –

+1

spring-test-mvc 1.0.0.M2; easyMock 3.1和Spring 3.1.0; – vicR

+1

你所有的Spring庫版本都應該是一樣的。在這種情況下,可能是'3.1.0'。 –

回答

0

你是你唱獨立設置並使用新的AdminSpringController()創建您的控制器;所以春天不能控制它。使用standaloneSetup可以更方便地同時測試一個控制器,而不需要連接到過濾器/攔截器等......這可能不是您正在尋找的。嘗試使用webAppContextSetup代替:

.... 
@Autowired 
private WebApplicationContext wac; 

@BeforeClass 
public void setUp(){ 
    mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); 
} 

這種方式它應該使用您的彈簧配置。

+0

我使用的是Spring 3.1和WebApplicationContext(http://docs.spring.io/spring/docs/3.2.0.BUILD-SNAPSHOT/api/org/springframework/test/context/web/WebAppConfiguration.html)自3.2以來的春天 – vicR

+0

WebAppConfiguration註釋自3.2開始,WebApplicationContext現在已經13歲:) – freakman

+0

好的。但我使用3.1 :) – vicR