如何在 spring 启动测试中配置 HandlerMethodArgumentResolver
How to configure HandlerMethodArgumentResolver in spring boot test
我正在为带有 spting 引导的控制器编写一个单元 @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());
}
}
在控制器中,我使用 spring HandlerMethodArgumentResolver
注入了一个 Principal
参数。请告诉我如何使用 MockMvc
编写单元测试,以便我可以注入一个模拟 Principal
对象作为控制器方法中的参数。
Auto-configured Spring MVC tests 部分解释了用 @WebMvcTest
注释的测试将扫描 HandlerMethodArgumentResolver
的 beans。所以我创建了一个扩展 HandlerMethodArgumentResolver
和 return 模拟 Principal
对象的 bean,如下所示。
@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 引导版本:- 1.4.5.RELEASE
您正在使用 MockMvc
调用您的控制器。因此,您必须使用参数、正文、URL 以及委托人等内容准备请求。您未指定的内容将不包括在内(您现在基本上是在没有经过身份验证的主体的情况下进行调用)。
Spring MVC 测试对 MockMvc 的支持通常记录在参考指南中。
有关更多详细信息,请查看用于构建模拟请求的组件 MockHttpServletRequestBuilder
。这就是您的 post
方法将 return 调用的方法 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());
}
像上面这样的东西应该可以解决问题。
我正在为带有 spting 引导的控制器编写一个单元 @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());
}
}
在控制器中,我使用 spring HandlerMethodArgumentResolver
注入了一个 Principal
参数。请告诉我如何使用 MockMvc
编写单元测试,以便我可以注入一个模拟 Principal
对象作为控制器方法中的参数。
Auto-configured Spring MVC tests 部分解释了用 @WebMvcTest
注释的测试将扫描 HandlerMethodArgumentResolver
的 beans。所以我创建了一个扩展 HandlerMethodArgumentResolver
和 return 模拟 Principal
对象的 bean,如下所示。
@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 引导版本:- 1.4.5.RELEASE
您正在使用 MockMvc
调用您的控制器。因此,您必须使用参数、正文、URL 以及委托人等内容准备请求。您未指定的内容将不包括在内(您现在基本上是在没有经过身份验证的主体的情况下进行调用)。
Spring MVC 测试对 MockMvc 的支持通常记录在参考指南中。
有关更多详细信息,请查看用于构建模拟请求的组件 MockHttpServletRequestBuilder
。这就是您的 post
方法将 return 调用的方法 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());
}
像上面这样的东西应该可以解决问题。