使用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模板时遇到同样的问题。根据我的研究,您可以尝试:
- 检查您的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);
.
.
.
}