简体   繁体   English

模拟调用 object 方法(Mockito Junit5 Spring)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM