Struts2 StrutsSpringJUnit4TestCase freemarker结果“;找不到名称“”的模板;

Struts2 StrutsSpringJUnit4TestCase freemarker结果“;找不到名称“”的模板;,struts2,freemarker,struts2-junit-plugin,Struts2,Freemarker,Struts2 Junit Plugin,我们一直在尝试对Struts2使用StrutsSpringJunit4TestCase,但当我们运行基本测试时,我们发现一个文件存在“找不到名称模板”错误: SEVERE: [29:39.103] Template not found for name "/WEB-INF/content/errors/error.ftl". The name was interpreted by this TemplateLoader: org.apache.struts2.views.freemarker

我们一直在尝试对Struts2使用
StrutsSpringJunit4TestCase
,但当我们运行基本测试时,我们发现一个文件存在
“找不到名称模板”
错误:

SEVERE:   [29:39.103] Template not found for name "/WEB-INF/content/errors/error.ftl".
The name was interpreted by this TemplateLoader: org.apache.struts2.views.freemarker.FreemarkerThemeTemplateLoader@7c060680.
调度程序#发送错误:500

测试用例似乎没有在
src/main/webapp/
中找到文件,因为相应的文件位于:`src/main/webapp/WEB-INF/content/errors/error.ftl

我们还需要做些什么来指导Struts2或测试在哪里找到freemarker模板

样本测试:

@ContextConfiguration(classes=TdarWebAppConfiguration.class)
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@交易的
公共类IndexController扩展StrutsSpringJUnit4TestCase{
受保护的最终记录器Logger=LoggerFactory.getLogger(getClass());
@试验
public void test()引发异常{
ActionProxy=getActionProxy(“/robots”);
HomepageSupportingController myAction=(HomepageSupportingController)proxy.getAction();
debug(executeAction(“/robots”);
String execute=myAction.execute();
完成执行();
debug(response.getContentType());
debug(response.getContentAsString());
assertEquals(“错误”,ActionSupport.SUCCESS,execute);
}
}
完整堆栈跟踪:

freemarker.template.TemplateNotFoundException: Template not found for name "/WEB-INF/content/errors/error.ftl".
The name was interpreted by this TemplateLoader: org.apache.struts2.views.freemarker.FreemarkerThemeTemplateLoader@7c060680.
    at freemarker.template.Configuration.getTemplate(Configuration.java:1833)
    at freemarker.template.Configuration.getTemplate(Configuration.java:1655)
    at org.apache.struts2.views.freemarker.FreemarkerResult.doExecute(FreemarkerResult.java:181)
    at org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:191)
    at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:369)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:273)
    at org.tdar.struts.interceptor.HttpsInterceptor.doHttpIntercept(HttpsInterceptor.java:52)
    at org.tdar.struts.interceptor.HttpsInterceptor.intercept(HttpsInterceptor.java:34)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at org.tdar.struts.interceptor.CacheControlInterceptor.intercept(CacheControlInterceptor.java:40)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at org.tdar.struts.interceptor.SessionSecurityInterceptor.intercept(SessionSecurityInterceptor.java:85)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at org.tdar.struts.interceptor.ActivityLoggingInterceptor.intercept(ActivityLoggingInterceptor.java:69)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:189)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:564)
    at org.apache.struts2.StrutsJUnit4TestCase.executeAction(StrutsJUnit4TestCase.java:140)
    at org.tdar.struts.action.IndexControllerITCase.test(IndexControllerITCase.java:31)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:85)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:86)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:241)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:87)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

发生这种情况是因为spring的
org.springframework.core.io.DefaultResourceLoader
MockServletContext
中使用,它不会像您在
freemarker
结果配置中使用的那样加载url-s,例如
/WEB-INF/content/errors/error.ftl

您可以通过在测试中重写
initServletMockObjects
方法来提供不同的资源加载器

@覆盖
受保护的void initServletMockObjects(){
servletContext=新的MockServletContext(您的\u自定义\u资源\u加载程序);
response=新的MockHttpServletResponse();
请求=新的MockHttpServletRequest();
pageContext=新的MockPageContext(servletContext、请求、响应);
}

之所以发生这种情况,是因为在
MockServletContext
中使用的spring的
org.springframework.core.io.DefaultResourceLoader
不会像您在
freemarker
结果配置中使用的那样加载url-s,例如
/WEB-INF/content/errors/error.ftl

您可以通过在测试中重写
initServletMockObjects
方法来提供不同的资源加载器

@覆盖
受保护的void initServletMockObjects(){
servletContext=新的MockServletContext(您的\u自定义\u资源\u加载程序);
response=新的MockHttpServletResponse();
请求=新的MockHttpServletRequest();
pageContext=新的MockPageContext(servletContext、请求、响应);
}

哪个S2版本?哪一行是
indexcontrollercase.java:31
?显示您试图执行的操作配置。Struts2版本:2.3.24;第31行是“HomepageSupportingController myAction=(HomepageSupportingController)proxy.getAction()`我们甚至尝试编写我们自己的FreeMarker配置(为了更好的供应路径,但没有进一步的改进)。谢谢哪一个版本?哪一行是
indexcontrollercase.java:31
?显示您试图执行的操作配置。Struts2版本:2.3.24;第31行是“HomepageSupportingController myAction=(HomepageSupportingController)proxy.getAction()`我们甚至尝试编写我们自己的FreeMarker配置(为了更好的供应路径,但没有进一步的改进)。感谢做出以下更改:servletContext=newmockservletcontext(applicationContext);你是否碰巧在网上有一个完整的测试参考?我们似乎只是一个接一个地讨论配置问题,而且几乎没有文档。(谢谢)全面工作测试。。。使用什么依赖项/配置?这个问题是关于使用
freemarker
result测试操作执行的。过去我用
tiles
结果做过一些S2测试,但它们不是公开的。如果你有更多的问题,你可以问一个新问题,我来看看。祝你好运。进行以下更改似乎有效:servletContext=newmockservletcontext(applicationContext);你是否碰巧在网上有一个完整的测试参考?我们似乎只是一个接一个地讨论配置问题,而且几乎没有文档。(谢谢)全面工作测试。。。使用什么依赖项/配置?这个问题是关于使用
freemarker
result测试操作执行的。过去我用
tiles
结果做过一些S2测试,但它们不是公开的。如果你有更多的问题,你可以问一个新问题,我来看看。祝你好运