Search code examples
spring-mvcjunit

@WebMvcTest does not find buildProperties


I have working JUnit tests for my MVC controllers. Now I wanted to display the build number in the footer of every page, so I added the following div in my thymeleaf templates:

<div class="versionInfo">Version <span th:text="${@buildProperties.getVersion()}"></span></div>

Now the test fail with:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'buildProperties' available

I tried to add it as a mock to no avail:

@MockBean
private BuildProperties buildProperties;

Or following this advice (see my comment below the answer).

So how can I make my tests work again with the BuildProperties?


Solution

  • When you try to access a bean via the following way: ${@buildProperties.getVersion()} it's actually a SpEL expression for accessing a bean via a BeanReference. Unfortunately it has no default value and instead of returning null it throws an exception if the bean cannot be found.

    I don't know any easy way to check if a bean exists in the context via SpEL.

    So I think the best solution if you create a nested test configuration class and define a default BuildProperties bean there.

    @TestConfiguration
    public static class TestConfig {    
      @Bean 
      BuildProperties buildProperties() {
        return new BuildProperties(new Properties());
      }
    }
    

    Or you can create it as a separate class and use @Import(TestConfig.class) if you need this extra configuration in multiple test classes.