当前位置: 首页 > 知识库问答 >
问题:

JUnit测试中的Freemarker和Spring

归俊
2023-03-14

与许多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会如此困难呢?

共有2个答案

贺飞星
2023-03-14

我发现使用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
柳培
2023-03-14

戴夫,

从位置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中测试这一点。我正在尝试以下方法的组合: 那么单元测试工具将是: 然后单元测试代码将是:

  • 我构建了一个有3个属性的帐户类:余额、所有者、acctNo。帐户类有2个构造函数,一个接受3个属性,一个不接受数据。帐户类有设置和获取方法以及存款和取款方法。 我还构建了一个类,该类从类扩展而来。将此类修改为类后,取款方法或此方法尝试将余额设置为零以下,将抛出。 JUnit测试人员修改测试方法,将尝试提取超过当前余额的可用,所以做测试方法。我需要修改JUnit测试透支帐户,以便它捕获异常,并捕获。