我的MVC控制器具有有效的JUnit测试。现在,我想在每个页面的页脚中显示内部版本号,因此在我的百里香模板中添加了以下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
的测试再次起作用?
答案 0 :(得分:1)
当您尝试通过以下方式访问Bean时:${@buildProperties.getVersion()}
实际上是用于通过BeanReference访问Bean的SpEL表达式。不幸的是,它没有默认值,如果找不到该bean,它会返回一个异常,而不是返回null
。
我不知道通过SpEL检查上下文中是否存在bean的任何简便方法。
因此,我认为最好的解决方案是创建一个嵌套的测试配置类并在那里定义一个默认的BuildProperties bean。
@TestConfiguration
public static class TestConfig {
@Bean
BuildProperties buildProperties() {
return new BuildProperties(new Properties());
}
}
或者,如果需要在多个测试类中进行此额外配置,则可以将其创建为单独的类并使用@Import(TestConfig.class)。
答案 1 :(得分:0)
如果您使用gradle,只需将其添加到build.grandle文件中:
SpringBoot { buildInfo() }
配置spring-boot-maven-plugin后,您可以构建应用程序并访问有关应用程序构建信息。 BuildProperties对象由Spring(@Autowired)注入
答案 2 :(得分:0)
将@WebMvcTest更改为完整的@SpringBootTestwould将解决此问题,因为随后将执行ProjectInfoAutoConfiguration。当我想坚持使用@WebMvcTest时,我将ProjectInfoAutoConfiguration包含到我的WebMvcTest中:
@WebMvcTest(YOUR_CONTROLLER_HERE.class)
@ImportAutoConfiguration(ProjectInfoAutoConfiguration.class)
class YOUR_CONTROLLER_HERETest{
// Use at your will
@Autowired
private BuildProperties buildProperties;
}