I'm working from the Spring documentation here. My goal is to use the "webAppContextSetup" option to test my spring configuration along with my controller, but I'm having trouble getting the controller's methods mapped inside of the TestDispatcherServlet. So far I have the following setup:
Data Configuration
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
<jpa:repositories base-package="com.example.test"/>
<bean id="contractManagementDataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="contractManagementDataSource"/>
<!-- no need for the load time weaving from the spring documentation since we're using hibernate as our JPA provider -->
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"/>
<context:property-placeholder location="classpath:config.properties"/>
</beans>
MVC Configuration
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.example.test"/>
<mvc:annotation-driven />
<mvc:resources mapping="/public/**" location="/public/"/>
<mvc:view-controller path="/" view-name="contract-management"/>
<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
ContractController.java
@RestController
@RequestMapping("contract")
public class ContractController {
@Autowired
DaoService daoService;
@RequestMapping("{name}")
public Contract getContract(@PathVariable String name) {
return daoService.findContract(name);
}
}
ContractControllerIT.java
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration("/spring/*.xml")
public class ContractControllerIT {
@Autowired
private WebApplicationContext webApplicationContext;
private MockMvc mockMvc;
@Before
public void setup() {
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}
@Test
public void getAccount() throws Exception {
mockMvc.perform(get("contract/{name}", "test")).andExpect(status().isOk());
}
}
At the moment I see the following error when I run the test:
java.lang.AssertionError: Status expected:<200> but was:<404>
And, interestingly, some seemingly contradictory logging statements before the failure.
10:38:09.410 [main] INFO org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [spring/mvc.xml]
10:38:09.469 [main] INFO org.springframework.web.context.support.GenericWebApplicationContext - Refreshing org.springframework.web.context.support.GenericWebApplicationContext@7a4ccb53: startup date [Mon Sep 28 10:38:09 MDT 2015]; parent: org.springframework.web.context.support.GenericWebApplicationContext@4a22f9e2
10:38:09.607 [main] INFO org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped "{[/contract/{name}]}" onto public com.example.test.domain.Contract com.example.test.controller.ContractController.getContract(java.lang.String) throws java.lang.Exception
10:38:09.786 [main] INFO org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter - Looking for @ControllerAdvice: org.springframework.web.context.support.GenericWebApplicationContext@7a4ccb53: startup date [Mon Sep 28 10:38:09 MDT 2015]; parent: org.springframework.web.context.support.GenericWebApplicationContext@4a22f9e2
10:38:09.813 [main] INFO org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter - Looking for @ControllerAdvice: org.springframework.web.context.support.GenericWebApplicationContext@7a4ccb53: startup date [Mon Sep 28 10:38:09 MDT 2015]; parent: org.springframework.web.context.support.GenericWebApplicationContext@4a22f9e2
10:38:09.840 [main] INFO org.springframework.web.servlet.handler.SimpleUrlHandlerMapping - Mapped URL path [/public/**] onto handler 'org.springframework.web.servlet.resource.ResourceHttpRequestHandler#0'
10:38:09.844 [main] INFO org.springframework.web.servlet.handler.SimpleUrlHandlerMapping - Root mapping to handler of type [class org.springframework.web.servlet.mvc.ParameterizableViewController]
10:38:09.889 [main] INFO org.springframework.mock.web.MockServletContext - Initializing Spring FrameworkServlet ''
10:38:09.889 [main] INFO org.springframework.test.web.servlet.TestDispatcherServlet - FrameworkServlet '': initialization started
10:38:09.898 [main] INFO org.springframework.test.web.servlet.TestDispatcherServlet - FrameworkServlet '': initialization completed in 9 ms
10:38:09.912 [main] WARN org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [contract/test] in DispatcherServlet with name ''
Also, this is my first question on StackOverflow, so any advice on how to improve my question is both welcome and appreciated.