Mocking Spring MVC BindingResult при использовании аннотаций - PullRequest
13 голосов
/ 18 мая 2009

Я перевожу контроллер Spring MVC для использования аннотаций более нового стиля и хочу провести модульное тестирование метода контроллера, который проверяет объект команды (см. Простой пример ниже).

 @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 для использования в модульном тесте ??

Ответы [ 2 ]

17 голосов
/ 13 октября 2011

Вы также можете использовать что-то вроде 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);
}

Это может дать вам больше гибкости и упростить строительные леса.

17 голосов
/ 18 мая 2009

BindingResult - это интерфейс, так что вы не можете просто передать одну из реализаций Springs этого интерфейса?

Я не использую аннотации в своем коде Spring MVC, но когда я хочу проверить метод проверки валидатора, я просто передаю экземпляр BindException, а затем использую значения, которые он возвращает в assertEquals и т. Д.

...