【问题标题】:How to configure HandlerMethodArgumentResolver in spring boot testspring boot test中如何配置HandlerMethodArgumentResolver
【发布时间】:2017-12-21 20:34:05
【问题描述】:

我正在为带有 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());
    }
}

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

Auto-configured Spring MVC tests 部分解释了用@WebMvcTest 注释的测试将扫描HandlerMethodArgumentResolver 的bean。所以我创建了一个扩展 HandlerMethodArgumentResolver 的 bean 并返回模拟 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 仍然没有传递给控制器​​方法。

Spring boot 版本:- 1.4.5.RELEASE

【问题讨论】:

  • 您需要在请求中指定主体,而不是创建额外的HandlerMethodArgumentResolverpost(/your-url).principal(new MockPrincipal()).
  • 非常感谢。我浪费了不必要的时间寻找其他选择:)。如果您不介意,请提一下,它记录在哪里?

标签: spring-boot junit spring-mvc-test spring-boot-test


【解决方案1】:

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

一般来说,参考指南中记录了对 MockMvc 的 Spring MVC 测试支持。

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

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

类似上面的东西应该可以解决问题。

【讨论】:

    猜你喜欢
    • 2020-10-04
    • 2021-05-07
    • 1970-01-01
    • 2020-07-21
    • 2014-07-26
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    相关资源
    最近更新 更多