2017-07-17 130 views
0

我写了一个控制器单元spting启动@WebMvcTest配置HandlerMethodArgumentResolver。如何在春天开机测试

使用@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对象在控制器方法的参数。

的sction Auto-configured Spring MVC tests解释说,与@WebMvcTest标注的测试将扫描的HandlerMethodArgumentResolver豆。所以我创建了一个扩展了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没有传递给控制器​​方法。

春季启动版本: - 1.4.5.RELEASE

+1

您需要在请求中指定主体,而不是创建额外的'HandlerMethodArgumentResolver'。 'post(/ your-url).principal(new MockPrincipal())'。 –

+0

非常感谢。我浪费时间不必要看其他选项:)。如果您不介意,请提一下,它在哪里记录? – Manu

回答

1

您正在使用MockMvc打电话给你的控制器。有了这个,你必须准备好诸如参数,正文,URL和委托人之类的东西。你没有指定的内容不会被包含(你现在基本上是在没有经过验证的委托人的情况下进行调用)。

对于MockMvc的Spring MVC测试支持通常在参考指南中有记录。

有关详细信息,请查看用于构建模拟请求的组件MockHttpServletRequestBuilder。这就是你的post方法将返回,这应该是一个调用MockHttpServletRequestBuilders.post(并可能是你的代码中的静态导入)。在[]之后,[CTRL] + [空格](或任何您最喜欢的代码完成快捷方式在您的iDE中)可以让您对可用内容有所了解。

@Test 
public void my_controller_test() throws Exception { 
    mockMvc.perform(post("/create-user").principal(new MockPrincipal()) 
      .andExpect(status().isCreated()); 
} 

上面的东西应该可以做到。