spring boot test中如何配置HandlerMethodArgumentResolver
Posted
技术标签:
【中文标题】spring boot test中如何配置HandlerMethodArgumentResolver【英文标题】:How to configure HandlerMethodArgumentResolver in spring boot test 【发布时间】: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
【问题讨论】:
您需要在请求中指定主体,而不是创建额外的HandlerMethodArgumentResolver
。 post(/your-url).principal(new MockPrincipal())
.
非常感谢。我浪费了不必要的时间寻找其他选择:)。如果您不介意,请提一下,它记录在哪里?
【参考方案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());
类似上面的东西应该可以解决问题。
【讨论】:
以上是关于spring boot test中如何配置HandlerMethodArgumentResolver的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 spring boot + .yaml 创建配置文件?