4

我正在为带有 spting boot 的控制器编写一个单元@WebMvcTest

使用@WebMvcTest,我将能够注入MockMvc如下所示的对象:-

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {TestConfig.class})
@WebMvcTest
class MyControllerTest {
    @Autowired
    private MockMvc mockMvc;

    @Test
    public void my_controller_test() throws Exception {
       mockMvc.perform(post("/create-user"))
              .andExpect(status().isCreated());
    }
}

在控制器中,我Principal使用 spring 注入一个参数HandlerMethodArgumentResolver。请告诉我如何使用 编写单元测试MockMvc,以便我可以Principal在控制器方法中注入一个模拟对象作为参数。

部分 Auto -configured Spring MVC tests解释了带有注释的测试@WebMvcTest将扫描HandlerMethodArgumentResolver. 所以我创建了一个 bean,它扩展HandlerMethodArgumentResolver并返回模拟Principal对象,如下所示。

@Component
public class MockPrincipalArgumentResolver implements HandlerMethodArgumentResolver {
   @Override
   public boolean supportsParameter(MethodParameter parameter) {
     return parameter.getParameterType().equals(Principal.class);
   }

   @Override
   public Object resolveArgument(MethodParameter parameter...) throws Exception {
     return new MockPrincipal();
   }
 }

但是参数仍然MockPrincipal没有传递给控制器​​方法。

春季启动版本:- 1.4.5.RELEASE

4

1 回答 1

1

您正在使用MockMvc调用您的控制器。有了它,您必须准备带有参数、正文、URL 以及主体等内容的请求。您未指定的内容将不包括在内(您现在基本上是在没有经过身份验证的委托人的情况下进行呼叫)。

MockMvc的 Spring MVC 测试支持通常记录在参考指南中。

有关更多详细信息,请检查用于构建模拟请求的组件MockHttpServletRequestBuilder。这是您的post方法将返回的内容,应该是调用MockHttpServletRequestBuilders.post(并且可能是代码中的静态导入)。之后的 [CTRL]+[SPACE](或任何您喜欢的代码完成快捷方式在您的 iDE 中)post()将使您对可用的内容有所了解。

@Test
public void my_controller_test() throws Exception {
   mockMvc.perform(post("/create-user").principal(new MockPrincipal())
          .andExpect(status().isCreated());
}

像上面这样的东西应该可以解决问题。

于 2017-07-17T11:19:50.123 回答