我们正在尝试为我们的Spring-MVC Web应用程序设置Spring-Test-
MVC。我们开始使用freemarker,一切都很好。但是,我们决定反对它,现在正尝试使用JSP进行设置。当测试应用程序部署在Tomcat上时,它就可以工作。当我们运行简单的测试时:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = WebContextLoader.class, locations = { "file:src/main/webapp/WEB-INF/servlet-context.xml" })
public class SkelletonTest {
@Inject
private MockMvc mockMvc;
@Test
public void homeTest() throws Exception {
mockMvc.perform(get("/")).andExpect(status().isOk())
.andExpect(content().type("text/html;charset=ISO-8859-1"))
.andExpect(content().string(containsString("Hello World!")));
}
它说:content type not set
或者如果将其删除,则内容将为空。但是,控制器将被调用,因此映射必须起作用。
因此,这强烈暗示我们的测试未呈现该视图,但是我不知道我可能缺少什么设置。
这是我们的servlet-context.xml:
<context:component-scan base-package="package.to.controllers" />
<mvc:annotation-driven />
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="exposeContextBeansAsAttributes" value="true" />
<property name="prefix" value="/views/" />
<property name="suffix" value=".jsp" />
</bean>
WebContextLoader:
public class WebContextLoader extends GenericWebContextLoader {
public WebContextLoader() {
super("src/main/webapp", false);
}
}
GenericWebContextLoader是spring-
test-mvc的原始版本。
MockMvc像这样设置为Bean:
@Configuration
public class TestConfig {
@Inject
private WebApplicationContext wac;
@Bean
public MockMvc create(){
return (MockMvcBuilders.webApplicationContextSetup(this.wac).build());
}
}
这就是设置。测试框架未使用web.xml,因为它以前已经在工作,所以无关紧要。
我认为servlet上下文中必须有其他设置。我检查了它的加载情况,但是对于Tomcat部署的应用程序来说,它很重要,但是我为它设置的前缀和后缀将被测试忽略。
不知道错误跟踪将有多大帮助,但是这里是:
java.lang.AssertionError: Content type not set
at org.springframework.test.web.AssertionErrors.fail(AssertionErrors.java:35)
at org.springframework.test.web.AssertionErrors.assertTrue(AssertionErrors.java:57)
at org.springframework.test.web.server.result.ContentResultMatchers$1.match(ContentResultMatchers.java:59)
at org.springframework.test.web.server.MockMvc$1.andExpect(MockMvc.java:84)
at our.package.SkelletonTest.homeTest(SkelletonTest.java:30)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
并测试输出:
2012-06-15 10:41:04 TestContextManager [INFO] @TestExecutionListeners is not present for class [class package.to.test.SkelletonTest]: using defaults.
2012-06-15 10:41:05 XmlBeanDefinitionReader [INFO] Loading XML bean definitions from URL [file:src/main/webapp/WEB-INF/servlet-context.xml]
2012-06-15 10:41:05 ClassPathBeanDefinitionScanner [INFO] JSR-330 'javax.inject.Named' annotation found and supported for component scanning
2012-06-15 10:41:05 GenericWebApplicationContext [INFO] Refreshing org.springframework.web.context.support.GenericWebApplicationContext@158539f: startup date [Fri Jun 15 10:41:05 CEST 2012]; root of context hierarchy
2012-06-15 10:41:05 AutowiredAnnotationBeanPostProcessor [INFO] JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
2012-06-15 10:41:05 DefaultListableBeanFactory [INFO] Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@c64bc2: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,testConfig,freemarkerController,homeController,tableService,org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping#0,org.springframework.format.support.FormattingConversionServiceFactoryBean#0,org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter#0,org.springframework.web.servlet.handler.MappedInterceptor#0,org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver#0,org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver#0,org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver#0,org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,viewResolver,org.springframework.context.annotation.ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor#0,create]; root of factory hierarchy
2012-06-15 10:41:05 RequestMappingHandlerMapping [INFO] Mapped "{[/],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public org.springframework.web.servlet.ModelAndView package.to.controller.HomeController.index()
2012-06-15 10:41:05 RequestMappingHandlerMapping [INFO] Mapped "{[/test],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String package.to.controller.HomeController.test(org.springframework.ui.Model)
2012-06-15 10:41:06 GenericWebContextLoader$1 [INFO] Initializing Spring FrameworkServlet ''
2012-06-15 10:41:06 TestDispatcherServlet [INFO] FrameworkServlet '': initialization started
2012-06-15 10:41:06 TestDispatcherServlet [INFO] FrameworkServlet '': initialization completed in 32 ms
2012-06-15 10:41:06 GenericWebApplicationContext [INFO] Closing org.springframework.web.context.support.GenericWebApplicationContext@158539f: startup date [Fri Jun 15 10:41:05 CEST 2012]; root of context hierarchy
2012-06-15 10:41:06 DefaultListableBeanFactory [INFO] Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@c64bc2: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,testConfig,freemarkerController,homeController,tableService,org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping#0,org.springframework.format.support.FormattingConversionServiceFactoryBean#0,org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter#0,org.springframework.web.servlet.handler.MappedInterceptor#0,org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver#0,org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver#0,org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver#0,org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,viewResolver,org.springframework.context.annotation.ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor#0,create]; root of factory hierarchy
因此,感谢您提供任何可帮助我定位问题的建议!
顺便说一句:不想再这样了,所以我跳过了pom。我们正在使用Spring 3.1,spring-test-mvc 1.0.0..BUILD-
SNAPSHOT,jsp-ap 2.2,jstl 1.2,…如果您需要了解更多信息,我将尝试将其上传到某个地方…
编辑
如果您需要更多信息,或者为什么无法回答我的问题,请告诉我。真的需要弄清楚,我不知道从哪里开始。因此,也欢迎任何想法或评论。
编辑2
使用了以下输出的打印方法:
MockHttpServletRequest:
HTTP Method = GET
Request URI = /
Parameters = {}
Headers = {}
Handler:
Type = package.to.controller.HomeController
Method = public org.springframework.web.servlet.ModelAndView package.to.controller.HomeController.index()
Resolved Exception:
Type = null
ModelAndView:
View name = index
View = null
Attribute = welcome
value = Hello World!
FlashMap:
MockHttpServletResponse:
Status = 200
Error message = null
Headers = {}
Content type = null
Body =
Forwarded URL = /views/index.jsp
Redirected URL = null
Cookies = []
哪个更好地显示了问题,但没有解决方案…
编辑3
刚刚发现以下内容:
JSP需要一个servlet容器。因此,看来我无法以这种方式测试我的网页…如果有人对解决此问题有任何想法,请告诉我。
添加到您的edit3中,本质上是为了JSP渲染,最后一次调用是
RequestDispatcher requestDispatcher = httpRequest.getRequestDispacher(jspPath)
requestDispatcher.forward(httpRequest,httpResponse)
并且RequestDispatcher
实现是由容器提供的(因为它取决于需要如何编译jsp,在何处放置已编译的jsp等)。RequestDispatcher的Mock实现只是捕获转发的JSP页面,并且您
只能验证到JSP的路径就是您期望的路径。
当我执行“MVN测试”时,我可以在日志中看到,在maven spring boot插件实例化spring boot实例之前,Cucumber runner被实例化: 我知道我的Cucumber测试实际上是一个集成测试,所以我将其作为“MVN验证”生命周期阶段的一部分运行,方法是将其重命名为CucumberRunnerIT.java,并按如下所示配置pom.xml: 但是,当我作为“验证”的一部分运
有一个使用SpringMVC4.0.3.Release的代码库,用于Restful Web服务。 ServletInitializer: 用户控制器: 用户道: 当我在本地调用构建时: 生成到stdout的输出: 正在运行com.myapp.rest.controllers.UserControllerTest 我到底做错了什么? 显然,我需要模拟出响应,但我在谷歌上搜索了这个结果,其他使用Moc
我有一些Selenium Webdriver测试,希望使用mvn-test从命令行运行。问题是,我可以清理,构建和编译没有问题,但没有测试运行。我没有收到任何与测试有关消息,如“There are no tests to run”。 我的junit测试遵循*Test类命名约定。 编辑:好的,我发现这是一个配置文件的问题-修复!
如何在docker容器中运行基于的测试用例? 我有一个简单的Spring Boot应用程序,它具有集成测试(组件级),使用与容器交互。测试用例正在破坏来自外部容器(本地机器)的罚款。 我们正在容器中运行所有内容,并且build正在docker jenkins映像上运行。Docker文件正在创建jar,然后创建image。找不到安装的docker。下面是我的docker文件。 处理这个案子最好的办法
我正在使用TestNG运行自动Selenium测试。当我作为TestNG套件运行时,一切都很好。但是当我作为Maven Test运行时,它们失败了。我非常困惑为什么他们会在一种情况下工作而不是另一种情况下。以下是测试的总体布局: base.java testbase.java
我已经检查了IntelliJ的调试器,并且可以确认mockMvc本身为空。因此,异常消息告诉我的只是“java.lang.NullPointerException”。 我已经尝试过为测试类添加更通用的Spring Boot注释,比如“@SpringBootTest”或“@RunWith(SpringRunner.class)”,以防与初始化Spring有关,但没有成功。