【发布时间】:2014-02-24 12:22:48
【问题描述】:
我正在使用 spring-test-mvc(独立),因为我的应用程序使用 spring 3.1 运行。我基本上只是想测试我的控制器方法和响应 HTTP 代码。
@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,是必要的)。
感谢任何帮助:)
// 编辑
我更新了我的代码:
@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)
【问题讨论】:
-
根本原因是春季版本问题。发布您正在使用的每个 spring jar 的版本。
-
spring-test-mvc 1.0.0.M2; easyMock 3.1 和 spring 3.1.0;
-
你所有的 Spring 库版本应该是一样的。在这种情况下,可能是
3.1.0。 -
没错;在 spring 3.1.0 spring-test-mvc 没有像在 3.2 中那样实现,因此我使用了独立项目 (github.com/spring-projects/spring-test-mvc)
-
我的调试控制台输出会有帮助吗?无法解决问题...
标签: java spring spring-mvc junit spring-test-mvc