在阅读之前,请注意我是Thymeleaf,Spring和Mockito的新手。所以我期待我犯一些业余错误。
我正在编写代码以使用百里香叶HTML模板发送电子邮件。我一直在网上查看不同的教程并尝试设置所有内容。我认为我的设置很好,但是当我编写测试来检查模板是否正在处理时,我返回"null"而不是某种形式的字符串。
我已经在两个中放置了一个模板文件:src/main/resources/templates 和 src/test/resources/templates
文件名为电子邮件.html
以下是我配置模板引擎和解析程序的代码。
@Configuration
public class SpringMailConfig{
...
@Bean
public SpringTemplateEngine springTemplateEngine(){
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.addTemplateResolver(htmlTemplateResolver());
templateEngine.setTemplateEngineMessageSource(emailMessageSource());
return templateEngine;
}
@Bean
public SpringResourceTemplateResolver htmlTemplateResolver() {
SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
templateResolver.setPrefix("/templates/");
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode(TemplateMode.HTML);
templateResolver.setCharacterEncoding(StandardCharsets.UTF_8.name());
return templateResolver;
}
...
}
这是我想在其中处理模板的类,我只展示我认为对这个问题很重要的内容。
@Component
public class EmailServiceHelper {
@Autowired
public SpringTemplateEngine springTemplateEngine;
private Context prepareContext(Locale locale, Map<String, Object> contextMap){
final Context context = new Context(locale);
context.setVariables(contextMap);
return context;
}
//returns as a string the template with the custom values inserted
private String returnHtmlContent(String templatePath, Locale locale, Map<String,Object> map){
Context ctx = prepareContext(locale, map);
return springTemplateEngine.process(templatePath, ctx);
}
}
这是我收到错误的测试类(其中的一部分(,springTemplateEngine.process(templatePath,ctx(返回null。
@RunWith(MockitoJUnitRunner.class )
public class EmailServiceHelperTest {
@Mock
SpringTemplateEngine springTemplateEngine;
@Mock
SpringResourceTemplateResolver springResourceTemplateResolver;
@InjectMocks
EmailServiceHelper helper;
@Before
public void setup(){
MockitoAnnotations.initMocks(this);
helper = new EmailServiceHelper();
helper.springTemplateEngine = springTemplateEngine;
helper.springTemplateEngine.setTemplateResolver(springResourceTemplateResolver);
}
@Test
public void testTemplateMessageHasContent(){
try {
Locale locale = new Locale("en");
Map<String, Object> contextMap = new HashMap<>();
contextMap.put("name", "Test name");
MimeMessage message = helper.prepareMimeMessage(mail, mailSender, contextMap, "email", locale);
assertNotNull(message.getContent());
}catch (MessagingException | IOException e){
e.printStackTrace();
fail("Testing if template message has content failed!");
}
}
}
这就是我的电子邮件模板的样子。
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>TEMPLATE</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
<h1 th:text="${name}">Hello, Static Person!</h1>
</body>
</html>
我想通了。正如怀疑的那样,这是我的菜鸟错误。由于我正在模拟模板引擎,因此我必须在测试中创建处理模板的方法。然后我做到了:
when(mockObject.processTemplate()).thenReturn(localProcessTemplateMethod();