Spring boot 如何在spring引导测试中配置HandlerMethodArgumentResolver
我正在为一个带有spting bootSpring boot 如何在spring引导测试中配置HandlerMethodArgumentResolver,spring-boot,junit,spring-mvc-test,spring-boot-test,Spring Boot,Junit,Spring Mvc Test,Spring Boot Test,我正在为一个带有spting boot@WebMvcTest的控制器编写一个单元 使用@WebMvcTest,我将能够注入MockMvc对象,如下所示:- @RunWith(SpringRunner.class) @ContextConfiguration(classes = {TestConfig.class}) @WebMvcTest class MyControllerTest { @Autowired private MockMvc mockMvc; @Test
@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());
}
}
在控制器中,我正在使用springHandlerMethodArgumentResolver
注入一个Principal
参数。请告知我如何使用MockMvc
编写单元测试,以便在控制器方法中插入一个mockPrincipal
对象作为参数
该选项解释了用@WebMvcTest
注释的测试将扫描HandlerMethodArgumentResolver
的bean。因此,我创建了一个bean,它扩展了HandlerMethodArgumentResolver
,并返回mockPrincipal
对象,如下所示
@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.发行版您正在使用
MockMvc
调用控制器。这样,您就必须准备带有参数、主体、URL和主体等内容的请求。您没有指定的内容将不包括在内(您现在基本上是在没有经过身份验证的主体的情况下进行调用)
对的Spring MVC测试支持通常记录在参考指南中
有关更多详细信息,请检查用于生成模拟请求的组件。这就是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());
}
像上面这样的东西应该可以达到目的 您需要在发出的请求中指定主体,而不是创建额外的
HandlerMethodArgumentResolver
post(/your url).principal(new MockPrincipal())
。非常感谢。我把时间浪费在寻找其他选项上:)。如果你不介意的话,请你提一下,它是在哪里记录的?