我有一个 Web 应用程序项目,我正在尝试对使用 FreeMarker 模板创建文件的方法进行单元测试。我的方法 createFile() 应该采用 MyFile 类型 - 包含要创建的文件名和 FreeMarker 需要的 rootMap 以及模板名称 - 并使用我提供的模板创建文件。
我正在按照Freemarker 手册设置模板加载器。问题是,我正在使用 TemplateLoader setClassForTemplateLoading(Class, String) 方法来查找模板路径。这个模板加载器使用 Class.getResource() 来获取类路径。
但是,由于我使用的是 Maven,所以我的 java 代码在 /src/main/java 中,我的模板在 /src/main/webapp/templates/ 中,我的测试代码在 /src/test/java 中。因此,我的 Class.getResource("/") (根类路径)总是返回<PATH_TO_PROJECT>/target/test-classes/
.
因为我要部署战争,所以我不能使用 setDirectoryForTemplateLoading(File)。此外,由于我正在测试我的应用程序,因此我没有可与 setServletContextForTemplateLoading(Object, String) 一起使用的 ServletContext。
如何从测试用例访问我的模板文件夹?
这是我的测试代码的简化示例(我使用 mockito 来模拟 MyFile 类的行为):
private MyFile myFile;
private FileGenerator fileGenerator;
@Before
public void setUp() {
myFile = new MyFile(...);
fileGenerator = new FileGenerator(myFile, ...);
}
@Test
public void shouldCreateFile() {
final MyFile mockedMyFile = spy(file);
final Map<String, Object> rootMap = new HashMap<String, Object>();
// populates rootMap with stuff needed for the Template
// mocking method return
when(mockedMyFile.getRootMap()).thenReturn(rootMap);
// replacing the MyFile implementation with my Mock
fileGenerator.setMyFile(mockedMyFile);
// calling the method I want to test
fileGenerator.createFile();
assertTrue(MyFile.getFile().exists());
}
这是我正在测试的代码的简化:
public void createFile() {
final Configuration cfg = new Configuration();
cfg.setClassForTemplateLoading(getClass(), "templates/");
try {
myFile.getFile().createNewFile();
final Template template = cfg.getTemplate("template.ftl");
final Writer writer = new FileWriter(myFile.getFile());
template.process(myFile.getRootMap(), writer);
writer.flush();
writer.close();
}
// exception handling
}