Saturday, April 12, 2014

Spring test with thymeleaf for views

I am a recent convert to thymeleaf for view templating in Spring based web applications, preferring it over jsp's. All the arguments that thymeleaf documentation makes on why thymeleaf over jsp holds water and I am definitely sold.

One of the big reasons for me, apart from being able to preview the template, is the way the view is rendered at runtime. Whereas the application stack has to defer the rendering of jsp to the servlet container, it has full control over the rendering of thymeleaf templates. To clarify this a little more, with jsp as the view technology an application only returns the location of the jsp and it is upto the servlet container to render the jsp.

So why again is this a big reason - because using the mvc test support in spring-test module, now the actual rendered content can be asserted on rather than just the name of the view.

Consider a sample Spring MVC controller :

public class ShopController {
 public String listProducts(Model model) {
  model.addAttribute("products", this.productRepository.findAll());
  return "products/list";

Had the view been jsp based, I would have had a test which looks like this:

@ContextConfiguration(classes = SampleWebApplication.class)
public class ShopControllerWebTests {

 private WebApplicationContext wac;

 private MockMvc mockMvc;

 public void setup() {
  this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();

 public void testListProducts() throws Exception {

the assertion is only on the name of the view.

Now, consider a test with thymeleaf used as the view technology:

public void testListProducts() throws Exception {
  .andExpect(content().string(containsString("Dummy Book1")));

Here, I am asserting on the actual rendered content.

This is really good, whereas with jsp I would had to validate that the jsp is rendered correctly at runtime with a real container, with thymeleaf I can validate that rendering is clean purely using tests.

No comments:

Post a Comment