2015-11-04 108 views
1

我試圖使用Spring測試MVC測試控制器方法。春季測試MVC:測試控制器重定向到另一個控制器

我有一個控制器,處理表單提交,並堅持一個新的條目到數據庫。

如果該方法是成功的,控制器執行重定向到另一個控制器(第二控制器從一個路徑變量檢索實體的ID,從數據庫中檢索它,填充模型的屬性,並顯示詳細信息頁面爲新持久實體) 。

在第一個控制器中,沒有屬性添加到Model或RedirectAttributes上。

這是控制器的方法,我試圖測試:

@RequestMapping("/save/{templateId}/{configParameterId}") 
public String saveGatewayPPTPConfigParameter(@PathVariable Long templateId, @PathVariable Long configParameterId, @Valid GatewayPPTPConfigParameterForm configParameterForm, BindingResult bindingResult, HttpServletRequest request, 
     RedirectAttributes flash, Model model) { 
... 
... 
... Code omitted 
... 
    return "redirect:/admin/gateway/config/template/details" + newTemplate.getId()+ "#tab_3"; 
    } 

如果此方法成功執行,則在第二控制器下面的代碼將填充與某些屬性的模型:

@RequestMapping(value = "/details/{templateId}", method = RequestMethod.GET) 
public String viewConfigTemplateDetails(@PathVariable Long templateId, Model model) throws IOException, ServletException, WifireAdminSessionException, WifireAdminException { 

.... 
.... 
....Code ommited 
.... 
.... 

    model.addAttribute("configTemplate", gatewayConfig); 

    return "/admin/gateway/config/template/details"; 
} 

考慮我的測試中的這個片段:

mvc.perform(
      post("/admin/gateway/config/parameter/save/{templateId}/{configParameterId}", 6 , 8) 
            .param("name", "name") 
            .param("value", "value") 
            .param("typeId", "3") 
            .param("parameterId", "2") 
            .param("readOnly", "false")) 

      .andDo(
        MockMvcResultHandlers.print() 
      ) 
      .andExpect(status().is3xxRedirection()) 
      .andExpect(view().name("redirect:/admin/gateway/config/template/details/"+mapping.getId()+"#tab_3")); 

該測試通過但如果我補充一下:

.andExpect(model().attribute("configTemplate", hasProperty("id",is(4l)))) 

它失敗,因爲configTemplate模型屬性爲空。

如果第二個控制器已成功執行,則會填充configTemplate。爲什麼expectedView是正確的,但第二個控制器似乎沒有執行?

+0

你能添加更多信息嗎?就像控制器代碼一樣,不是完整的代碼,而是方法定義,模型的改變以及方法與視圖的返回。 – reos

+0

我添加了您請求的信息。 –

回答

0

我不知道,但我假設是:

你有這樣的路徑與控制器

/admin/gateway/config/parameter/ 

聯繫人,這條路徑可欣賞

/admin/gateway/config/template/ 

如果產生密切相關是真的,你重定向到一個視圖

return "redirect:/admin/gateway/config/template/details" + newTemplate.getId()+ "#tab_3"; 

而第二個控制器從未執行,這是因爲您重定向的結果視圖永遠不會執行。因此,如果您檢查預期的視圖是正確的,但控制器永遠不會執行。

+0

但我似乎仍然在空模型屬性上得到thymeleaf異常。 所以現在我只是專注於測試第一個控制器,然後在第二個階段看第二個控制器。 –