我正在使用Spring文档here。我的目标是使用" webAppContextSetup"选项以测试我的弹簧配置以及我的控制器,但是我无法将控制器的方法映射到TestDispatcherServlet内部。到目前为止,我有以下设置:
数据配置
<?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配置
<?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());
}
}
目前,当我运行测试时,我看到以下错误:
java.lang.AssertionError: Status expected:<200> but was:<404>
有趣的是,在失败之前,一些看似矛盾的日志声明。
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 ''
另外,这是我关于StackOverflow的第一个问题,所以关于如何改进我的问题的任何建议都是受欢迎和赞赏的。
答案 0 :(得分:5)
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 ''
最后一部分说明了一切:“合同/测试”没有映射,这是您在集成测试中执行GET
请求的原因。
但是,控制器中的映射没有任何问题。唯一的问题是您在集成测试中省略了前导斜杠。
以下解决了您的问题:
@Test
public void getAccount() throws Exception {
mockMvc.perform(get("/contract/{name}", "test"))
.andExpect(status().isOk());
}
特别注意"/contract/{name}"
中的前导斜杠。
此致
Sam( Spring TestContext Framework的作者)
答案 1 :(得分:0)
我看到了一些不同于我通常为我的控制器做的事情。测试:
ContractController.java - 为两个请求映射添加斜杠:
@RequestMapping("/contract")
...
@RequestMapping("/{name}")
ContractControllerIT.java - 添加斜杠:
@Test
public void getAccount() throws Exception {
mockMvc.perform(get("/contract/{name}", "test")).andExpect(status().isOk());
}