使用Thymeleaf的Spring Boot 1.4 MVC测试导致TemplateProcessingException

时间:2016-07-02 21:38:18

标签: spring-mvc spring-boot thymeleaf spring-mvc-test

我正在尝试测试Spring Boot 1.4.0.M3 MVC切片。控制器就是这个。

@Controller
public class ProductController {

private ProductService productService;

@Autowired
public void setProductService(ProductService productService) {
    this.productService = productService;
 }

 @RequestMapping("product/{id}")
 public String showProduct(@PathVariable Integer id, Model model){
    model.addAttribute("product", productService.getProductById(id));
    return "productshow";
 }
}

productshow.html百里叶模板的最小化视图就是这样。

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<body>
 <div class="container">  
  <h2>Product Details</h2>
    <div>
        <form class="form-horizontal">
            <div class="form-group">
                <label class="col-sm-2 control-label">Product Id:</label>
                <div class="col-sm-10">
                    <p class="form-control-static" th:text="${product.id}">Product Id</p></div>
            </div>
            <div class="form-group">
                <label class="col-sm-2 control-label">Description:</label>
                <div class="col-sm-10">
                    <p class="form-control-static" th:text="${product.description}">description</p>
                </div>
            </div>                
        </form>
   </div>
  </div>
</body>
</html>

测试类就是这个。

@RunWith(SpringRunner.class)
@WebMvcTest(controllers = ProductController.class, secure = false)
//@AutoConfigureMockMvc(secure=false)
public class ProductControllerTest {
    @Autowired
    private MockMvc mockMvc;
    @MockBean
    private ProductService productServiceMock;

@Test
public void testShowProduct() throws Exception {
   Product product1 = new Product();
   product1.setId(1);
   product1.setDescription("T Shirt");
   product1.setPrice(new BigDecimal("18.95"));
   product1.setImageUrl("https://example.com/wp-content/uploads/2015/04/spring_framework_guru_shirt-rf412049699c14ba5b68bb1c09182bfa2_8nax2_512.jpg");
   when(productServiceMock.getProductById(1)).thenReturn(product1);

   MvcResult result = mockMvc.perform(get("/product/{id}/", 1))
           .andExpect(status().isOk())              
           .andReturn();
 }
}

运行测试时,我收到以下错误。

2016-07-03 00:03:29.021 ERROR 6800 --- [           main]  
org.thymeleaf.TemplateEngine             : [THYMELEAF][main] Exception  
processing template "productshow": Exception evaluating SpringEL 
expression: "product.id" (productshow:19)

org.springframework.web.util.NestedServletException: Request processing  
failed; nested exception is 
org.thymeleaf.exceptions.TemplateProcessingException: Exception 
evaluating SpringEL expression: "product.id" (productshow:19)

需要帮助才能解决此问题。提前谢谢。

1 个答案:

答案 0 :(得分:0)

将正确的控制器传递给@WebMvcTest解决了问题。通过ProductController.class后编辑的代码正在运行。