我为我的MVC控制器做了JUnit测试。现在我想在每个页面的页脚显示构建号,所以我在我的thymeleaf模板中添加了以下div:
<div class="versionInfo">Version <span th:text="${@buildProperties.getVersion()}"></span></div>
现在测试失败:
由于:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有名为“buildProperties”的Bean可用
我试着把它作为一个模拟,但无济于事:
@MockBean
private BuildProperties buildProperties;
或者遵循this advice(请参阅我在答案下方的评论)。
那么,我如何才能让我的测试再次与BuildProperties
工作?
3条答案
按热度按时间hlswsv351#
当您尝试通过以下方式访问Bean时:
${@buildProperties.getVersion()}
它实际上是一个SpEL表达式,用于通过BeanReference访问bean。不幸的是,它没有默认值,如果找不到bean,它不会返回null
,而是抛出一个异常。我不知道有什么简单的方法可以通过SpEL检查bean是否存在于上下文中。
所以我认为最好的解决方案是创建一个嵌套的测试配置类,并在那里定义一个默认的BuildProperties bean。
或者,如果您需要在多个测试类中进行额外的配置,您可以将其创建为一个单独的类并使用@Import(TestConfig.class)。
nbewdwxp2#
如果您使用的是gradle,只需将以下内容添加到您的build.grandle文件:
配置完spring-boot-maven-plugin之后,你就可以构建应用程序并访问有关应用程序构建的信息。BuildProperties对象由Spring(@Autowired)注入
toe950273#
将@WebMvcTest更改为完整的@SpringBootTest可以解决这个问题,因为这样就会执行ProjectInfoAutoConfiguration。由于我想坚持使用@WebMvcTest,我将ProjectInfoAutoConfiguration包含到我的WebMvcTest中:
当然,只有正确配置了Sping Boot Maven Plugin,这才能起作用。