2016-02-19 78 views
1

自定義對象,我需要JUnit測試,以檢查控制器。通過提交表單來調用控制器的方法。該方法接收填充對象EmailDispatchForm formMockMvc。如何參與JUnit測試

下面是從控制器片段:

@RequestMapping(value={"/sendEmail"}, method=POST) 
public String sendEmail(EmailDispatchForm form,Model model){ 
    String status = "OK"; 

    try { 
     workFlows.sendEmailAndRecordHistory(form); 
    } catch (Exception e) { 
     status = "ERROR"; 
     model.addAttribute("errDescription", e.getCause().getMessage()); 
     logger.error(e, e); 
    } finally { 
     model.addAttribute("sentEmailStatus", status); 
    } 

    return CommonConstants.VIEW_EMAIL_SENT; 
} 

這是我的JUnit測試:

@RunWith(SpringJUnit4ClassRunner.class) 
@WebAppConfiguration 
@ContextConfiguration(classes = {WebConfig.class}) 
public class HomeControllerTest { 

    @Autowired 
    private WebApplicationContext webApplicationContext; 

    private MockMvc mockMvc; 

    @Before 
    public void setup() { 
     mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); 
    } 

    @Test 
    public void testShowEmailForm() throws Exception{ 
     mockMvc.perform(get("/emailForm")).andExpect(view().name(CommonConstants.VIEW_EMAIL)); 
    } 
} 

怎麼可以看到,在控制器中存在的方法sendEmail(),這有兩個參數:EmailDispatchForm formModel model。我不知道如何在junit測試中涉及這兩個參數以將其用作模擬對象。

我會非常感謝幫助,並想了解一些資源(書籍)來研究這個問題的主題。

回答

0

第一個問題是,你要使用GET和存取權限帖子的網址。 您的測試方法應該是這樣的:

@Test 
    public void testShowEmailForm() throws Exception{ 
     mockMvc.perform(post("/sendEmail")).andExpect(view().name(CommonConstants.VIEW_EMAIL)); 
    } 

而且在你的控制器方法中添加@RequestBody

public String sendEmail(@RequestBody EmailDispatchForm form,Model model) 

要添加的形式簡單地添加到測試方法:

.contentType(MediaType.APPLICATION_JSON) 
     .content(json) 

凡JSON是「EmailDispatchForm表單」對象的JSON形式。

希望這會有所幫助。

+0

謝謝Cremson。這也是一個解決方案。 –

0

所以,我發現了其他的解決方案。它看起來像這樣:

\t @Test 
 
\t public void loginUser() throws Exception { 
 
\t \t LoginForm loginForm = new LoginForm(); 
 
\t \t loginForm.setPassword("admin"); 
 
\t \t loginForm.setUserId("admin"); 
 
\t \t 
 
\t \t RequestBuilder request = post("/authentication") 
 
\t \t \t \t .flashAttr("loginForm", loginForm); 
 
\t \t 
 
\t \t mockMvc 
 
\t \t .perform(request) 
 
\t \t .andDo(MockMvcResultHandlers.print()) 
 
\t \t .andExpect(redirectedUrl("emailForm")); 
 
\t }
的控制器

的方法

\t @RequestMapping(value={"/authentication"}, method=POST) 
 
\t public String toAuthentication(@ModelAttribute("loginForm")LoginForm loginForm, Model model){ 
 
\t \t String view ="redirect:emailForm"; 
 
\t \t // some activity here to take the loginForm and process it 
 
\t \t return view; 
 
\t }