@WebMvcTest does not find buildProperties

2019-07-27 12:11发布

问题:

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?

回答1:

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.



回答2:

If you are using gradle , just add this to your build.grandle file:

SpringBoot { buildInfo() }

After configuring the spring-boot-maven-plugin you can build the application and access information about application’s build. The BuildProperties object is injected by Spring (@Autowired)