【发布时间】: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()). -
非常感谢。我浪费了不必要的时间寻找其他选择:)。如果您不介意,请提一下,它记录在哪里?
标签: spring-boot junit spring-mvc-test spring-boot-test