2017-08-18 17 views
1

if-else条件での結果@Validのバインディング結果をJunit、Mockitoテストケースに書き込む方法は?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

私はバインディング結果とSCRIPTFILEクラスの両方を模擬するために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

それはこのようなものになります。オブジェクトをインスタンス化できる場合は、mockではなくspyを使用できます。または、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)beforeメソッドでmock()を呼び出す代わりに、@Mockを使用します。 B)彼の例と一致するようにしてください。 create()は1ではなく3つの引数をとります。 C)目標は、1)方法の公開契約をテストし、2)その上で、生産クラスのすべての経路をテストすることであることを強調する。最後に、** ModelMapを模擬することが本当に必要かどうか疑問です。 「通常の」実装を使用できない場合は、オブジェクトをモックするだけです。私は、単に地図を渡してそれに応じて設定できることを願っています。 – GhostCat

+0

ありがとう、私はIDEでそれを検証せずにちょうど私の記憶からそれを書いていた:)。私はModelMapが嘲笑されるべきではないと思っていますが、コード全体がなくてもわかりません。 –

0

利用スプリングテストMockMvC、そのうちの一つは、既存のコードがたくさんあります。

Using Spring MVC Test to unit test multipart POST request

そして、あなたのコードスニペットは、あなたが(のparamsを結合していない、機能していません@ RequestParam) @RequestMappingの代わりに@PostMappingを使用する

関連する問題