Pregunta

I try to write integration tests for my spring MVC app.

Problem:

It seems that TilesView can't resolve views in my spring mvc tests. In my test MockMvcResultMatchers.forwardedUrl() returns "/WEB-INF/jsp/layout.jsp", instead of "/WEB-INF/jsp/manageEntities.jsp"

*My app works fine, problems exist only in tests!

See '//Assertion error' comment in my test class

Code:

Maybe code will be more explanatory than words. I tried to make it as clear as it possible.

Controller:

@Controller
public class MyController {

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

Test:

@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>
¿Fue útil?

Solución

Your assertion is wrong. You are using Tiles and as such that ViewResolver is also consulted, remember you are basically doing an integration test NOT a unit test. You are testing the whole chain of components working together.

You need to either switch the ViewResovler for your test, basically rendering your test less valuable as you are not testing the actual configuration, or find another validating the response. (You might need the content and check the title for instance).

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

Basically the above checks the resulting page, to contain the given String. (From the top of my head so might require some tweaking).

More information

  1. MockMvcResultMatchers
  2. ContentResultMatchers
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top