[英]Mock call object method (Mockito Junit5 Spring)
I try to mock the thymeleaf template engine.我尝试模拟 thymeleaf 模板引擎。
My test class:我的测试 class:
@ExtendWith(MockitoExtension.class)
@RunWith(JUnitPlatform.class)
public class MailServiceTest {
@InjectMocks
private MailService mailService;
@Mock private JavaMailSender mailSender;
@Mock private TemplateEngine templateEngine;
@BeforeEach
public void setMockOutput() {
doReturn("<html>Template processed String</html>").when(templateEngine.process(any(String.class), any(IContext.class)));
}
@Test
public void testNewMailBoxMail() throws MessagingException, IOException {
mailService.newMailBoxMail("M.", "nom", "adresse@email.fr");
...
}
I got a lot of trouble with the process method parameter ( org.mockito.exceptions.misusing.InvalidUseOfMatchersException
) and I'm not sure that they are OK.我在处理方法参数(
org.mockito.exceptions.misusing.InvalidUseOfMatchersException
)上遇到了很多麻烦,我不确定它们是否正常。
As the test reach the doReturn
line I get当测试到达
doReturn
线时,我得到
java.lang.IllegalArgumentException: Template cannot be null
at org.thymeleaf.util.Validate.notNull(Validate.java:37)
at org.thymeleaf.TemplateSpec.<init>(TemplateSpec.java:314)
at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1048)
at fr.strasbourg.accountManagement.service.MailServiceTest.setMockOutput(MailServiceTest.java:50)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:515)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:115)
at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.invokeMethodInExtensionContext(ClassTestDescriptor.java:436)
at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.lambda$synthesizeBeforeEachMethodAdapter$14(ClassTestDescriptor.java:424)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeBeforeEachMethods$2(TestMethodTestDescriptor.java:136)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeBeforeMethodsOrCallbacksUntilExceptionOccurs(TestMethodTestDescriptor.java:156)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeBeforeEachMethods(TestMethodTestDescriptor.java:135)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:110)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:59)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:105)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:95)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:71)
at java.util.ArrayList.forEach(ArrayList.java:1249)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:110)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:95)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:71)
at java.util.ArrayList.forEach(ArrayList.java:1249)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:110)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:95)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:71)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:170)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:154)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:90)
at org.junit.platform.runner.JUnitPlatform.run(JUnitPlatform.java:139)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:542)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:770)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:464)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)
Can somebody help my to mock Thymeleaf template engine?有人可以帮我模拟Thymeleaf模板引擎吗?
Thank Dominique感谢 Dominique
The template engine is injected as bean in the MailService object.模板引擎作为 bean 注入到 MailService object 中。 Here is the MailService code:
这是邮件服务代码:
@Service
public class MailService {
@Autowired private JavaMailSender mailSender;
@Autowired private TemplateEngine templateEngine;
private static final String SUPPORT_EMAIL_ADDRESS = "Support@email.fr";
public void newMailBoxMail(String pCivility, String pName, String pEmailAddress) throws MessagingException {
// template context (model)
final Context vContext = new Context();
vContext.setVariable("civility", pCivility);
vContext.setVariable("name", pName);
vContext.setVariable("email", pEmailAddress);
// create HTML from template
final String vHtmlContent = templateEngine.process("html/NewMailbox.html", vContext);
// create mail
MimeMessage vMimeMessage = mailSender.createMimeMessage();
MimeMessageHelper vMessage = new MimeMessageHelper(vMimeMessage, "UTF-8");
vMessage.setSubject("Charte messagerie");
vMessage.setFrom(SUPPORT_EMAIL_ADDRESS);
vMessage.setTo(pEmailAddress);
vMessage.setText(vHtmlContent, true);
// send mail
mailSender.send(vMimeMessage);
}
}
Mockito does not allow to test final methods and process() of Template Engine is final. Mockito 不允许测试模板引擎的最终方法和 process() 是最终的。
However you can make it work.但是,您可以使其工作。 Just in you
/src/test/resources
create directory mockito-extensions
.就在你
/src/test/resources
创建目录mockito-extensions
。 Inside create file org.mockito.plugins.MockMaker
with given content: mock-maker-inline
.在内部创建文件
org.mockito.plugins.MockMaker
给定内容: mock-maker-inline
。
That works.这样可行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.