org.thymeleaf.TemplateEngine mockito problem



嗨,我有一个mock方法templateEngine.produce(…(.的问题

public class MailTemplateCreator {
private final TemplateEngine templateEngine;
public MailTemplateCreator(@Qualifier("templateEngine") TemplateEngine templateEngine) {
this.templateEngine = templateEngine;
}
/** Method for inject variables for thymeleaf html template.
* @param values class for inject values for thymeleaf context.
* @return values inject into Email-alert-template.html.
*/
public String buildEmailTemplate(TemplateValues values){
Context context = new ContextBuilder()
.addVariable("topic",EmileMassages.topic(values.getChangedData()))
.addVariable("welcome",EmileMassages.welcome(values.getName()))
.addVariable("message",EmileMassages.message(values.getChangedData(),values.getDataValue()))
.addVariable("button",EmileMassages.buttonName(values.getChangedData()))
.addVariable("change_url",EmileMassages.changeLink(values.getChangeDataLink()))
.addVariable("goodbye", EmileMassages.goodbye())
.addVariable("app_name",EmileMassages.appName()).build();
return templateEngine.process("email/Email-alert-template.html",context);
}
}
class MailTemplateCreatorTest {
@InjectMocks
MailTemplateCreator creator;
@Mock
TemplateEngine templateEngine;
@Test
void name() {
//Given
TemplateValues values = TemplateValues.builder()
.changeDataLink("test link")
.changedData("test Data")
.dataValue("test value")
.name("test name").build();
when(templateEngine.process("email/Email-alert-template.html",any(Context.class))).thenReturn("Test");
//When
String emailHtml =creator.buildEmailTemplate(values);
//Then
assertThat(emailHtml).isNotEmpty();
}

18:37:50.435[main]调试org.thymelaf.TEMPLATE ENGINE-[thymeleaf]初始化模板引擎

org.mockito.exceptions.missing.InvalidUseOfMatchersException:参数匹配器的使用无效!需要0个匹配者,记录了1个:->网址:com.juniorstart.juniorstart.email.MailTemplateCreatorTest.name(MailTemplateCreatorTest.java:39(

如果匹配器与原始值组合,则可能会发生此异常://不正确:someMethod(anyObject((;原始字符串"(;使用匹配器时,所有参数都必须由匹配器提供。例如://更正:someMethod(anyObject((,eq("匹配器字符串"(;

有关更多信息,请参阅javadoc For Matchers类。

at org.thymeleaf.TemplateEngine.initialize(TemplateEngine.java:328)
at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1079)
at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1059)
at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1048)
at com.juniorstart.juniorstart.email.MailTemplateCreatorTest.name(MailTemplateCreatorTest.java:39)
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:686)
at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140)
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84)
at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:212)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:208)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:137)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:71)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:135)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1507)
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:139)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1507)
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:139)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
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:248)
at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$5(DefaultLauncher.java:211)
at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:226)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:199)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:132)
at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:69)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)

实际上,GitHub上早就报道过这个。问题是mockito没有嘲笑最终方法(这是有道理的(。解决方案是使用ITemplateEngine接口,如果我理解正确的话,它是自Thymelaf 3.0以来提供的。

将类的实现从public MailTemplateCreator(@Qualifier("templateEngine") TemplateEngine templateEngine)更改为public MailTemplateCreator(@Qualifier("templateEngine") ITemplateEngine templateEngine),并模拟接口@Mock ITemplateEngine templateEngine;

现在,您可以随心所欲地存根,例如when(templateEngine.process(anyString(),any(Context.class))).thenReturn("Test");

最新更新