Spring boot 如何在spring引导测试中配置HandlerMethodArgumentResolver

Spring 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

我正在为一个带有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());
    }
}
在控制器中,我正在使用spring
HandlerMethodArgumentResolver
注入一个
Principal
参数。请告知我如何使用
MockMvc
编写单元测试,以便在控制器方法中插入一个mock
Principal
对象作为参数

该选项解释了用
@WebMvcTest
注释的测试将扫描
HandlerMethodArgumentResolver
的bean。因此,我创建了一个bean,它扩展了
HandlerMethodArgumentResolver
,并返回mock
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.发行版

您正在使用
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())
。非常感谢。我把时间浪费在寻找其他选项上:)。如果你不介意的话,请你提一下,它是在哪里记录的?