Пустой контент в весеннем тесте mvc

Я не смог проверить содержимое страницы с помощью весеннего теста mvc, потому что он пуст.

Учитывая простейший возможный контроллер:

@RequestMapping(value = "/home")
public String home(HttpSession session, ModelMap model) {
  return "home";
}

соответствующая конфигурация тайлов:

<definition name="base.definition" template="/jsp/view/application.jsp">
  <put-attribute name="header" value="/jsp/view/header.jsp" />
  <put-attribute name="menu" value="/jsp/view/menu.jsp" />
  <put-attribute name="title" value="" />
  <put-attribute name="body" value="" />
  <put-attribute name="footer" value="/jsp/view/footer.jsp" />
</definition>
<definition name="home" extends="base.definition">
  <put-attribute name="title" value="Welcome" />
  <put-attribute name="body" value="/jsp/view/home/list-home.jsp" />
</definition>

Простой list-home.jsp

<p>Welcome</p>

И тест:

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration()
@ContextConfiguration(classes = WebTestConfig.class)
public class HomeControllerTest {
  @Autowired
  private WebApplicationContext wac;
  private MockMvc mockMvc;

  @Before
  public void _setup() {
    this.mockMvc =   MockMvcBuilders.webAppContextSetup(this.wac).build();
  }

  @Test
  public void home() throws Exception {
    mockMvc.perform(get("/home"))
        .andDo(print())
        .andExpect(status().isOk())
        .andExpect(forwardedUrl("/jsp/view/application.jsp"))
        .andExpect(content().string("Welcome"));
  }

И это не удается java.lang.AssertionError: Response content expected:<Welcome> but was:<>

распечатанный ответ выглядит следующим образом:

MockHttpServletResponse:
              Status = 200
       Error message = null
             Headers = {}
        Content type = null
                Body = 
       Forwarded URL = /jsp/view/application.jsp
      Redirected URL = null
             Cookies = []

Окружающая среда:

  • Весна 3.2
  • Плитка 2
  • Ява 6

Что я пропустил?

NB: код работает в Tomcat с реальным браузером.


person takacsot    schedule 09.03.2015    source источник
comment
Вы не можете протестировать jsp (контент) с помощью весеннего теста mvc. Еще сложнее, если есть плитки. Я не нахожу ссылку на документацию или источник, но это невозможно.   -  person meistermeier    schedule 09.03.2015
comment
Документация: docs.spring.io/spring-framework/docs/3.2.0.BUILD-SNAPSHOT/ со следующей строкой For the most part everything should work as it does at runtime with the exception of JSP rendering, which is not available outside a Servlet container   -  person meistermeier    schedule 09.03.2015
comment
Итак, процесс тестирования представлен в infoq.com/presentations/spring-mvc-test-htmlunit. недоступен до Spring 4.x. Я прав?   -  person takacsot    schedule 10.03.2015
comment
Извините за непонятный адрес ссылки. Он по-прежнему действителен для Spring 4. Я просто просмотрел презентацию и соответствующие источники на github. Похоже, они на самом деле не проверяют jsp с помощью чистого весеннего теста mvc, а используют (инструмент) HtmlUnit для проверки результата. На мой взгляд, такого рода тесты делают шаг от простого модульного тестирования к (что-то вроде) системным/интеграционным тестам, потому что вы покидаете внутренности своего кода, тестируя его снаружи (HtmlUnit).   -  person meistermeier    schedule 10.03.2015
comment
Чтобы получить решение для своего теста, вы должны подумать о том, чтобы сделать первый шаг, протестировав один контроллер с помощью MockMvcBuilders#standaloneSetup. Здесь вы можете предоставить ViewResolver (например, Jackson для json) и проверить содержимое.   -  person meistermeier    schedule 10.03.2015
comment
С @ResponseBody аннотированными контроллерами все работает нормально. Я вернул правильные строки JSON в теле.   -  person takacsot    schedule 10.03.2015


Ответы (1)


Вы не можете писать утверждения для содержимого страницы JSP, поскольку страницы JSP визуализируются контейнером сервлета, а Spring MVC Test не запускает контейнер сервлета. Вы можете только убедиться, что имя представления указано правильно и/или запрос перенаправлен на правильный URL-адрес.

Однако вы можете написать утверждения для содержимого ваших представлений, если вы используете технологию представления, которая не требует контейнера сервлета (например, Velocity или Thymeleaf).

person pkainulainen    schedule 10.06.2016
comment
Можете ли вы расширить на Thymeleaf? - person Dragas; 02.11.2019