与许多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>
然后在我们的代码中,我们自动连接bean,如下所示:
@Autowired
protected Configuration freemarkerConfiguration;
并像这样使用它:
Template template = freemarkerConfiguration.getTemplate("mail/job/detail.ftl");
这在我们部署的应用程序的上下文中非常有效,在Quartz作业中执行。但是我们总是在单元测试中运行时找不到模板。
我尝试了许多不同的方法,但没有一种奏效。最后一个涉及创建我自己的Freemarker TemplateLoader实现,并尝试让它从类路径加载Freemarker模板文件。这种方法的问题是:a)我在其他测试中成功使用的同一类加载代码找不到模板,b)我不确定正确实现TemplateLoader所涉及的所有内容,以及c)这一切总体上看起来过于复杂。
我可以继续这条路线,但首先。。。我是否遗漏了一些明显的东西?Freemarker的优点之一是它不需要HTTP上下文,那么为什么在web应用上下文之外使用Freemarker会如此困难呢?
我发现使用MockMvc可以让我的单元测试在src/main/resources[目标/类]中找到ftl模板。但是,当我使用TestRestTemplate时,它只在src/test/resources[目标/测试类]中看到ftl模板。
就我而言,我使用的是@SpringBootTest。我不确定这是否相关。
此外,如果您调高这些命名空间的级别,您可以看到更好的调试输出。
logging.level.freemarker=TRACE
logging.level.org.springframework.ui.freemarker=DEBUG
logging.level.org.springframework.web.servlet.view.freemarker=DEBUG
戴夫,
从位置src/main/webapp/...
使用的ftl文件不在类路径中。我相信您的测试类位于位置src/test/...
,它不会对ftl文件具有可见性(实际上在src/main/webapp//WEB-INF/freemarker/mail/job/*. ftl
中),因此您会得到模板未找到异常。如果您希望它们在类路径上,请将文件放在src/test/资源中。
在使用JUnit进行测试时,我无法理解一些事情,我编写了一些测试,而有些测试似乎可以简单地使用 而且 有些似乎不能与它们一起工作,所以我必须使用 而且 我理解@mockbean是在处理spring容器时使用的,而@mock只是用来复制/模拟某个类及其方法。但是什么时候才是使用@mockbean的最佳时机呢? 上面是我在spring boot应用程序中为一个控制器编写的测试,但当我使用@mock模拟
我正在为Junit编写测试,以测试我编写的删除函数: 此方法适用于同时具有前后节点的双链接列表。 问题是:我们的大学将针对我们编写的测试运行错误代码,以确定我们是否编写了足够的测试来捕获错误代码和异常。 我知道他们将运行的两个测试,但不知道错误的含义。 > 失败:缺少逻辑 故障:缺少NextNodeRepairLogic 这是我没有考虑的两个测试,因为我无法理解这些错误的含义。有人知道这些错误可能
我需要jUnit测试的帮助,我的结果是json文件,我需要测试该文件的长度,问题是在jsonPath函数中没有这样的方法。 这里是我的测试方法,预期长度是7。如有任何帮助,我将不胜感激,谢谢
我不能在HttpSession上进行模拟。测试方法如下所示: 测试结果如下所示: 我总是得到未经授权的例外,但我需要避免它。如何为会话添加一些参数来模拟工作?
我在Java EE托管bean中有以下代码: 其中facesContextProvider是一个用于返回faces上下文的自定义类(对于模拟测试很有用)。 我想知道如何使用Mockito在JUnit中测试这一点。我正在尝试以下方法的组合: 那么单元测试工具将是: 然后单元测试代码将是:
我有这两种方法,在使用Mock实现测试时遇到了困难。我该如何参加考试? 我有麻烦得到Jboss目录而不必启动System.get属性(jboss.server.temp.dir);