2017-08-18 195 views
1

如何为绑定结果编写Junit,Mockito测试用例@Valid if-else条件示例的功能?如何编写junit mokito测试用例

@RequestMapping(value = "/scriptfile", method = RequestMethod.POST)  
public String create(
    @Valid ScriptFile scriptFile, 
    BindingResult result, 
    ModelMap modelMap 
) 
{   
    if (scriptFile == null) 
     throw new IllegalArgumentException("A scriptFile is required"); 

    if (result.hasErrors()) {     
     modelMap.addAttribute("scriptFile", scriptFile);      
     modelMap.addAttribute("showcases", ShowCase.findAllShowCases());      
     return "scriptfile/create";     
    }    
    scriptFile.persist();    
    return "redirect:/scriptfile/" + scriptFile.getId();   
} 

如何为上面的例子编写一个Junitm Mockito测试用例?

回答

0

我会使用到的Mockito嘲笑具有约束力的结果和脚本文件类:

@Test 
public void create_WithErrors(){ 
    BindingResult bindingResult = Mockito.mock(BindingResult.class); 
    BindingResult scriptFile = Mockito.mock(ScriptFile.class); 
    Mockito.when(bindingResult.hasErrors()).thenReturn(true); 
    String result = create(scriptFile, bindingResult, new ModelMap()); 
    Mockito.verify(bindingResult.hasErrors()); 
    Mockito.verify(scriptFile .persist(), Mockito.never()); 
    assertThat(result, is(equalTo("scriptfile/create"))) 
} 
1

它会是这样的。如果可以实例化对象,则可以使用间谍而不是模拟。或者甚至创建一个ModelMap实例,并检查属性是否正确设置而不是模拟。

@Mock 
private BindingResult result; 

@Mock 
private ModelMap modelMap; 

@Mock 
private ScriptFile scriptFile; 

@BeforeMethod 
public void setUp() throws Exception { 
    MockitoAnnotations.initMocks(this); 
} 

@Test(expectedExceptions = {IllegalArgumentException.class}) 
public void shouldThrowIllegalArgumentException() { 
    create(null, result, modelMap); 
} 

@Test 
public void shouldPersistFile() { 
    Mockito.when(result.hasErrors()).thenReturn(false); 
    Mockito.when(scriptFile.getId()).thenReturn("FILE_ID"); 

    String output = create(scriptFile, result, modelMap); 

    Mockito.verify(scriptFile, times(1)).persist(); 
    assertEquals("redirect:/scriptfile/FILE_ID", output) 
} 

@Test 
public void shouldHandleErrors() { 
    Mockito.when(result.hasErrors()).thenReturn(true); 
    Mockito.when(scriptFile.getId()).thenReturn("FILE_ID"); 

    String output = create(scriptFile, result, modelMap); 

    Mockito.verify(modelMap, times(2)).addAttribute(Mockito.any(), Mockito.any()); 
    assertEquals("scriptfile/create", output) 
} 
+0

我会:A)使用@Mock而不是在before方法中调用mock()。 B)一定要匹配他的例子。 create()需要3个参数,而不是1! C)强调目标必须是1)测试方法的公共契约,2)最重要的是,测试生产班级中的所有路径。最后:我想知道是否真的需要**模拟** ModelMap。只有在“正常”实现无法使用时才会模拟对象。我希望可以简单地传入地图并相应地进行配置。 – GhostCat

+0

谢谢,我只是从我的记忆中写下它,没有用IDE验证它:)。我不认为ModelMap应该被嘲弄,但是没有完整的代码,我不知道。 –