Модульное тестирование контроллера Spring 3 с методами, которые возвращают только имя представления - PullRequest
0 голосов
/ 20 сентября 2011

Насколько я понимаю, эффективный способ модульного тестирования пружинного контроллера - это слишком простое создание нового экземпляра (требуемого контроллера) и непосредственное тестирование методов контроллера.Не беспокоиться о Mock-запросах и т. Д., Так как самому Spring нужно тестировать.

Однако многие из моих методов контроллера просто возвращают имя представления в виде одной строки, и я хочу проверить, что сама модель имеет правильные параметрыи данные.

Нужно ли менять методы, чтобы они возвращали ModelAndView, чтобы я мог получить доступ к модели в рамках модульного теста?Должны ли мои методы делать это (возвращая модель и представление) в любом случае?

Когда я создаю новый ModelAndView в методе контроллера, существующая Модель перезаписывается?

1 Ответ

2 голосов
/ 20 сентября 2011

Я постараюсь ответить на некоторые из ваших вопросов.

О модульном тестировании контроллеров, иногда я обнаруживал, что необходимо добавить запрос и ответ Spring Mock, так как некоторые функции Spring ожидают запрос и ответ вконтекст запроса.

class MyTest {
    private MockHttpServletRequest request;
    private MockHttpServletResponse response;

    @BeforeMethod(alwaysRun = true)
    public void setup() {
        request = new MockHttpServletRequest();
        response = new MockHttpServletResponse();
        controller = new Controller( /*inject dependencies here*/ );
    }
}

Это легко понять, потому что, если их там нет, вы получите очень конкретную ошибку о том, что запрос или ответ не в контексте.

к модели я обнаружил, что проще вернуть ModelAndView и добавить несколько тестов, которые проверяют выходные параметры и имя представления.

public void shows_xxx_index_view {
    assertThat(modelAndView.getViewName(), equalTo("controller/index"));
}

public void model_contains_search_results {
    assertThat(modelAndView.getModelMap().get("searchResults"), equalTo(expected_results));
}

И я не знаю, перезаписывается ли модель.

Это мой опыт небольшого проекта, поэтому я ни в коем случае не эксперт, но я нашел этот подход полезным.

...