@WebMvcTest from Spring Boot

I have recently blogged about @DataJpaTest annotation from Spring Boot v1.4. It is one of test improvements introduced in this version. The other one is @WebMvcTest which I would like to write about today.

What is its purpose? This annotation automatically configures tests of web endpoints provided by our application. It narrows the number of classes loaded to the ones required to have a complete MVC test environment.

Here is briefly what does it do under the hood:

  • bootstraps test context by @BootstrapWith(WebMvcTestContextBootstrapper.class),
  • imports cache configuration (@AutoConfigureCache) as @DataJpaTest does,
  • imports configuration of web MVC (handlers for incoming requests, raised exceptions and web resources, view controllers, converters of responses send back, etc.) through AutoConfigureWebMvc,
  • configures mock MVC with AutoConfigureMockMvc which allows setting whether security support should be enabled, web driver (for Selenium) and client (for HtmlUnit) should be used for tests and how to proceed with printing of received MVC results,
  • imports controllers specified as a parameter value of WebMvcTest.

Comparing to the previous way of writing MVC tests, @WebMvcTest replaces two annotations: @WebAppConfiguration and @ContextConfiguration (in case of using Spock in tests the latter has still to be provided). With possibility to only load controller classes provided in the annotation parameter, tests become more lightweight.

I was a bit surprised that MvcResult is printed every time, even I do not use MockMvcResultHandlers.print() handler after performing a test call. It turned out the printing is enabled by default. This is actually pretty useful for me. When I write MVC tests I always have to look for the class where printing handler is placed. With MockMvcPrint enum it is possible to set results printing with System.out (the default one), System.err or logger (on DEBUG level). You can disable printing with NONE option.

The option of using Selenium or HtmlUnit in your tests is very nice. And with auto configuration mechanism you only need to add proper dependencies to your tests’ classpath and you can inject WebDriver and WebClient into your tests to assert HTML pages. This is a valuable addition to the framework.

I have created the BookController class with a couple of tests in my Spring playground to check the annotation. The controller uses the BookService as a business logic implementation that talks to JPA repository. With @MockBean (yet another new thing in Spring Boot v1.4) on the service class, I could easily detach the controller’s tests from database configuration. The ease of enabling Selenium/HtmlUnit tests is impressive as well. With all these improvements WebMvcTest gives us, a developer has way more time to focus on testing behaviour of an application instead of setting a test environment. After this short (yet useful) exercise I have to admit the annotation is a good add-on to the framework.

There is a lot of nice-to-have things in Spring Boot v1.4. If you have this possibility, you should definitely update its version in your project.

Leave a Reply