Spring MVC + Tiles: интеграционное тестирование

Я пытаюсь написать интеграционные тесты для своего весеннего приложения MVC.

Проблема:

Кажется, что TilesView не может разрешать представления в моих весенних тестах mvc. В моем тесте MockMvcResultMatchers.forwardedUrl() возвращает "/WEB-INF/jsp/layout.jsp" вместо "/WEB-INF/jsp/manageEntities.jsp"

*Мое приложение работает нормально, проблемы есть только в тестах!

См. комментарий '//Assertion error' в моем тестовом классе

Код:

Возможно, код будет более понятным, чем слова. Я постарался сделать это как можно более ясным.

Контроллер:

@Controller
public class MyController {

@RequestMapping("/manageEntities.html")
public String showManageEntitiesPage(Map<String, Object> model) {
    //some logic ...
    return "manageEntities";
}

Тест:

@WebAppConfiguration
@ContextHierarchy({
        @ContextConfiguration(locations = { "classpath:ctx/persistenceContextTest.xml" }),
        @ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/servlet.xml" })
})
@RunWith(SpringJUnit4ClassRunner.class)
public class EntityControllerTest {

    @Autowired
    protected WebApplicationContext wac;

    private MockMvc mockMvc;

    @Before
    public void setUp() throws Exception {
        this.mockMvc = webAppContextSetup(this.wac).build();
    }

     @Test // FAILS!!
    public void entity_test() throws Exception {

        //neede mocks 
        //........

        mockMvc.perform(get("/manageEntities.html"))
                .andExpect(status().isOk())
                .andExpect(forwardedUrl("/WEB-INF/jsp/manageEntities.jsp")); //Assertion error!!!
    }
}

tiles.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
       "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
       "http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
<tiles-definitions>
    <definition name="base.definition" template="/WEB-INF/jsp/layout.jsp">
    <put-attribute name="title" value="" />
    <put-attribute name="header" value="/WEB-INF/jsp/header.jsp"/>
    <put-attribute name="menu" value="/WEB-INF/jsp/menu.jsp" />
    <put-attribute name="body" value="" />
    <put-attribute name="footer" value="/WEB-INF/jsp/footer.jsp" />
    </definition>

    <definition name="manageEntities" extends="base.definition">
        <put-attribute name="title" value="Manage Entities"/>
        <put-attribute name="body" value="/WEB-INF/jsp/manageEntities.jsp"/>
    </definition>
//....

AssertionError:

java.lang.AssertionError: Forwarded URL expected:</WEB-INF/jsp/manageEntities.jsp> but was:</WEB-INF/jsp/layout.jsp>

person VB_    schedule 16.09.2013    source источник


Ответы (1)


Ваше утверждение неверно. Вы используете Tiles, и поэтому ViewResolver также консультируется, помните, что вы в основном выполняете интеграционный тест, а НЕ модульный тест. Вы тестируете всю цепочку компонентов, работающих вместе.

Вам нужно либо переключить ViewResovler для своего теста, в основном делая ваш тест менее ценным, поскольку вы не тестируете фактическую конфигурацию, либо найти другой, подтверждающий ответ. (Вам может понадобиться содержание и, например, проверить название).

mockMvc.perform(get("/manageEntities.html"))
            .andExpect(status().isOk())
            .andExpect(content().source(containsString("Manage Entities"));

В основном приведенное выше проверяет результирующую страницу на наличие заданной строки. (На мой взгляд, поэтому может потребоваться некоторая настройка).

Дополнительная информация

  1. MockMvcResultMatchers
  2. ContentResultMatchers
person M. Deinum    schedule 16.09.2013
comment
Пожалуйста, подробнее. Что вы имеете в виду под поиском другого, подтверждающего ответ. - person VB_; 16.09.2013