Thymeleaf:在单元测试期间不渲染吗?

时间:2019-02-22 07:16:04

标签: unit-testing spring-boot thymeleaf

由于我没有其他问题here的答案,因此我正在寻找另一种方法。有没有办法在单元测试期间不执行或包含片段?

我想在模板的页脚中显示版本和内部版本号,因此我有以下一行:

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

这在运行应用程序时效果很好,但是在单元测试期间出现异常:

  

没有名为“ buildProperties”的bean可用

在另一个问题中,我正在寻找一种在单元测试期间获取此bean的方法,作为替代方案,我现在正在寻找一种在单元测试期间排除该模板的方法。像这样:

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

我在测试类上使用了以下注释:

@RunWith(SpringRunner.class)
@WebMvcTest(SimpleController.class)

2 个答案:

答案 0 :(得分:1)

如果这是标准的单元测试,请使用Mockito模拟bean:

@RunWith(MockitoJUnitRunner.class)
public class SomeTest{

  @Mock
  private BuildProperties buildProperties;

  ...

或者,如果它是Spring MVC测试:

@RunWith(SpringRunner.class)
@WebMvcTest(value = MyController.class)
public class MyControllerTest{

  @MockBean
  private BuildProperties buildProperties;

版本为null,因为模拟的bean的所有方法都返回null

如果要模拟真实版本,可以在测试或setUp()方法中添加类似的内容

given(buildProperties.getVersion()).willReturn("whatever");

-----------------编辑

不幸的是,只有将buildProperties bean直接添加到模型中时,以上所有解决方案才有效。 但是在您的情况下,您可以直接将 豆用作SpEL Bean引用。不幸的是,我不知道通过SpEL检查上下文中是否存在bean的任何方法。 另外,将多余的代码添加到代码中以检查代码是否在测试模式下运行也不是一个好习惯。 因此,我认为最好的解决方案是创建一个嵌套的测试配置类并在那里定义默认的BuildProperties bean。

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

或者,如果您需要在多个测试类中进行此额外配置,则可以使用@Import(TestConfig.class)

答案 1 :(得分:0)

我从一位同事那里得到了一个提示,可以解决这个问题。

只需将具有自定义属性的application.properties添加到src/test/resources

isUnitTest=true

然后我可以在我的百里香模板中简单地检查一下:

<div class="versionInfo" th:if="${@environment.getProperty('isUnitTest') != 'true'}">Version <span th:text="${@buildProperties.getVersion()}"></span></div>

尽管如果有人找到一种方法,可以用我到目前为止找不到的百里香设置或属性自动实现此目的,我会接受它作为答案。