2017-07-17 87 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()); 
} 

上面的東西應該可以做到。