使用Thymeleaf模板测试服务的单元测试时的问题引擎

使用Thymeleaf模板测试服务的单元测试时的问题引擎

问题描述:

单元测试我的服务时出现nullPointerException异常,我不明白为什么?我使用Spring引导。 这是我提供模板的简单服务。我自动装配了TemplateEngine组件。使用Thymeleaf模板测试服务的单元测试时的问题引擎

@Service 
public class TicketTemplatingService implements ITemplatingService{ 

    @Autowired 
    private TemplateEngine templateEngine; 

    /** 
    * This method will return a ticket template 
    */ 
    @Override 
    public String buildHtmlTemplating(Object object, String templateName) { 
     Ticket ticket= (Ticket)object; 
     //Build the template 
     Context context = new Context(); 
     context.setVariable("id", ticket.getId()); 
     context.setVariable("date", ticket.getDate());   
     return templateEngine.process(templateName, context); 
    } 

} 

这个类的单元测试低于:

@SpringBootTest 
@RunWith(SpringRunner.class) 
@ActiveProfiles("test") 
public class TemplatingServiceTest { 


    @InjectMocks 
    private TicketTemplatingService ticketTemplatingService; 

    @Mock 
    private TemplateEngine templateEngine; 

    @Before 
    public void setup(){ 
     MockitoAnnotations.initMocks(this); 
    } 

    @Test 
    public void testHtmlTemplateReturnTheHtmlTemplate(){ 
     Ticket ticket= new Ticket(); 
     ticket.setId(1L); 
     Date date=new Date(); 
     ticket.setDate(date); 

     Context context=new Context(); 
     context.setVariable("id", 1L); 
     context.setVariable("date", date); 

     //Mock the process method of the templateEngine bean 
     when(templateEngine.process("TemplateName", refEq(context))).thenReturn("Html template result"); 

     //Now we can test the method 
     String htmlTemplate=ticketTemplatingService.buildHtmlTemplating(ticket, "TemplateName"); 
     assertThat(htmlTemplate).isEqualTo("Html template result"); 
    } 
} 

在该试验中类中,templateEngine可变嘲笑返回零,然后我得到的NullPointerException这样做时“时(templateEngine.process( “TemplateName”,refEq(context)))。thenReturn(“Html template result”);“

请帮助我吗?我真的不明白为什么。

我在使用Mokito测试thymeleaf模板时遇到同样的问题。根据我的研究,您可以尝试:

  1. 检查您的Thymeleaf罐的版本。如果使用spring-boot-starter-thymeleaf dependecny,它可能仍然使用版本号< 3.0,该版本比当前的稳定版本旧。

根据此链接:Final methods in TemplateEngine make it difficult to mock 3.0版本有这样的问题更好的解决方案。

如果您使用的是3.0+版本,那么PowerMock可以解救。 参考此链接:https://github.com/powermock/powermock/wiki/mockfinal 如何嘲笑最终方法(此链接使用了EasyMock)

如果使用< 3.0版,截至目前,唯一的临时修复,我发现是从第一个链接的最后评论在文中。

祝你好运,希望更多的人才能回答这个问题。

而不是

@Autowired 
private TemplateEngine templateEngine; 

采用此接口的为您服务。

import org.thymeleaf.ITemplateEngine; 

@Autowired 
private ITemplateEngine templateEngine; 

并在测试类使用同一个班一个模拟

@Mock 
private ITemplateEngine emailTemplateEngine; 

@Before 
public void setup(){ 
    @when(emailTemplateEngine.process(eq(TEMPLATE_USER_CREATION), any(Context.class))).thenReturn(userCreationHtml); 
    . 
    . 
    . 
}