Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JUnit测试中的Freemarker和Spring_Java_Spring_Junit_Freemarker - Fatal编程技术网

Java JUnit测试中的Freemarker和Spring

Java JUnit测试中的Freemarker和Spring,java,spring,junit,freemarker,Java,Spring,Junit,Freemarker,与许多Java应用程序一样,我们在应用程序中使用Freemarker来呈现电子邮件。我们发现我们的一些模板并没有像我们想象的那样呈现,因此我们意识到我们应该为模板呈现编写一些单元测试。我设置了测试,并立即收到一个FileNotFoundException:找不到模板“my/Template.ftl” 我想这一定是一个既能解决问题又能简单解决的问题。那是很多小时前的事了,我意识到我错了;据我所知,这既不是解决的问题,也不容易 我认为,我们的应用程序设置相当标准。我们有一个Maven项目,并将Fre

与许多Java应用程序一样,我们在应用程序中使用Freemarker来呈现电子邮件。我们发现我们的一些模板并没有像我们想象的那样呈现,因此我们意识到我们应该为模板呈现编写一些单元测试。我设置了测试,并立即收到一个FileNotFoundException:找不到模板“my/Template.ftl”

我想这一定是一个既能解决问题又能简单解决的问题。那是很多小时前的事了,我意识到我错了;据我所知,这既不是解决的问题,也不容易

我认为,我们的应用程序设置相当标准。我们有一个Maven项目,并将Freemarker模板存储在src/main/webapp/WEB-INF/Freemarker中。虽然我们的应用程序的大部分功能是由Quartz jobs启动的,但我们将其部署为一个webapp。因此,我们只需要spring XML文件中的以下配置:

<bean id="freemarkerConfiguration"
    class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
    <property name="templateLoaderPath" value="/WEB-INF/freemarker/" />
</bean>
并像这样使用它:

Template template = freemarkerConfiguration.getTemplate("mail/job/detail.ftl");
这在我们部署的应用程序环境中非常有效,在Quartz作业中执行。但是,当从单元测试中运行时,我们总是得到找不到的模板

我尝试了许多不同的方法,但没有一种有效。最后一步是创建我自己的Freemarker TemplateLoader实现,并尝试让它从类路径加载Freemarker模板文件。这种方法的问题在于:a)我在测试中其他地方成功使用的相同类加载代码找不到模板;b)我不确定正确实现TemplateLoader所涉及的所有内容;c)这一切总体上看起来过于复杂

我可以继续走这条路,但首先。。。我错过了什么明显的东西吗?Freemarker的优点之一是它不需要HTTP上下文,那么为什么在web应用上下文之外使用Freemarker会如此困难呢


从位置
src/main/webapp/…
使用的ftl文件不在类路径中。我相信您的测试类位于位置
src/test/…
,它对ftl文件(实际上位于
src/main/webapp//WEB-INF/freemarker/mail/job/*.ftl
中)不可见,因此您得到的模板未发现异常。如果希望它们位于类路径上,请将文件放在src/test/resources中。

我发现使用MockMvc可以让我的单元测试在src/main/resources[target/classes]中找到ftl模板。但是当我使用TestRestTemplate时,它只在src/test/resources[target/test classes]中看到ftl模板

在我的例子中,我使用@SpringBootTest。我不确定这是否相关

此外,如果将这些名称空间的级别调高,则可以看到更好的调试输出

logging.level.freemarker=TRACE
logging.level.org.springframework.ui.freemarker=DEBUG
logging.level.org.springframework.web.servlet.view.freemarker=DEBUG

普拉萨德,你说得很对。我没有在OP中提到我至少使用Maven将.ftl文件复制到src/test/。。。路径,但那仍然是复制它们的错误位置。将它们复制到src/test/resources现在允许我通过类加载器加载它们。这就解决了我的一个问题,尽管我仍然怀疑我在这里是否太复杂了。我的目标是测试我创建的ftl页面,并确保它在我的一个函数中正确构建。将这些文件移到测试文件夹会复制这些文件,并且可能不同步。如何在测试中自动添加这些内容的建议?
logging.level.freemarker=TRACE
logging.level.org.springframework.ui.freemarker=DEBUG
logging.level.org.springframework.web.servlet.view.freemarker=DEBUG