【问题标题】:Spring-Test-Mvc Controller TestsSpring-Test-Mvc 控制器测试
【发布时间】: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 中有一个上下文文件,但它只包含 &lt;context:annotation-config /&gt;&lt;tx:annotation-driven /&gt;,我是否必须将我的控制器 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


【解决方案1】:

您正在使用standaloneSetup 并使用 new AdminSpringController(); 创建您的控制器;所以 spring 无法控制它。使用standaloneSetup 可以更方便地一次测试一个控制器,而无需连接到过滤器/拦截器等......这可能不是您想要的。尝试改用 webAppContextSetup:

....
 @Autowired
private WebApplicationContext wac;

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

这样它应该使用你的 spring 配置。

【讨论】:

  • 我使用的是 spring 3.1 并且 WebApplicationContext (docs.spring.io/spring/docs/3.2.0.BUILD-SNAPSHOT/api/org/…) 自 3.2 起就在 spring 中
  • WebAppConfiguration 注解从 3.2 开始,WebApplicationContext 现在已经 13 岁了 :)
  • 好的。但我使用的是 3.1 :)
  • 但你不需要 @WebAppConfiguration ; )
  • 好的。所以我自动连接 WebApplicationContext 和mockMvc = MockMvcBuilders.webApplicationContextSetup(wac).build();。但后来我得到java.lang.IllegalArgumentException: WebApplicationContext is required。我想我搞错了一些基本的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-08
  • 2012-05-25
  • 1970-01-01
  • 2013-08-11
  • 2021-04-01
相关资源
最近更新 更多