14

新しいスタイルのアノテーションを使用するようにSpringMVCコントローラーを移行しており、コマンドオブジェクトを検証するコントローラーメソッドを単体テストしたいと考えています(以下の簡単な例を参照)。

 @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を使用するだけで、これらは簡単にモック可能でしたが、新しい注釈スタイルの柔軟性により、署名を介してさらに多くの情報を渡す必要があります。

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

4

3 に答える 3

18

Mockitoのようなものを使用して、BindingResultのモックを作成し、それをコントローラーメソッドに渡すこともできます。

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);
}

これにより、柔軟性が高まり、足場が簡素化されます。

于 2011-10-13T18:17:52.127 に答える