2009-05-18 20 views
13

私は、新しいスタイルの注釈を使用するようにSpring MVCコントローラを移行しており、コマンドオブジェクトを検証するコントローラメソッドを単体テストしたいとします(下の簡単な例を参照)。注釈を使用したときのSpring MVC BindingResultのモーグ

@RequestMapping(method = RequestMethod.POST) 
public String doThing(Command command, BindingResult result, 
        HttpServletRequest request, HttpServletResponse response, 
        Map<String, Object> model){ 
    ThingValidator validator = new ThingValidator(); 
    validator.validate(command, result); 
... other logic here 
    } 

私の問題は、私はコードを正しく行使するその署名を満たすために、私のユニットテストで、コントローラのメソッドを呼び出して、モック値を提供する必要がある、と私はBindingResultを模擬する方法を動作することはできません。

旧式のコントローラでは、署名は単純に嘲笑されたHttpServletRequestとHttpServletResponseを取っただけですが、新しい注釈スタイルの柔軟性のために、より多くの署名を渡す必要があります。

単体テストで使用するためにSpring BindingResultをどのようにモックできますか?

答えて

15

BindingResultはインターフェイスなので、そのインターフェイスのスプリング実装の1つを渡すだけではありませんか?

などを私はSpring MVCのコードに注釈を使用していないが、私はバリデータのvalidateメソッドをテストしたいとき、私はちょうどはBindExceptionのインスタンスに渡し、その後のassertEqualsにそれが返す値を使用

+4

こんにちはマーク、 私は正しいトラックに私を置く。 BindingResultの使用bindingResult = new BeanPropertyBindingResult(コマンド、 "command");私のテストの中でコマンドオブジェクトをモデルに張り付けることは、テストを並べ替えるように思えました。 –

+1

それは私もそれを行う方法です。 –

+0

それをありがとう、私を助けてくれました! – Stefan

14

またBindingResultのモックを作成するためにMockitoようなものを使用し、これはあなたに多くの柔軟性を提供し、足場を簡素化することができますすなわち

import static org.mockito.Mockito.mock; 
import static org.mockito.Mockito.when; 
import static org.mockito.Mockito.verifyZeroInteractions; 

@Test 
public void createDoesNotCreateAnythingWhenTheBindingResultHasErrors() { 
    // Given 
    SomeDomainDTO dto = new SomeDomainDTO(); 
    ModelAndView mv = new ModelAndView(); 

    BindingResult result = mock(BindingResult.class); 
    when(result.hasErrors()).thenReturn(true); 

    // When 
    controller.create(dto, result, mv); 

    // Then 
    verifyZeroInteractions(lockAccessor); 
} 

、お使いのコントローラメソッドにそれを渡すことができます。

+0

'lockAccessor'とは何ですか? –