【问题标题】:Thymeleaf: Do not render during unit test?Thymeleaf:在单元测试期间不渲染?
【发布时间】:2019-07-16 05:48:43
【问题描述】:

由于我的另一个问题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)

【问题讨论】:

  • 能否分享一下java代码。 1.您是否自动装配了该类并且 buildProperties 在上下文中可用? 2. 你是否使用了 Mock 或任何 ReflectionTestUtils ? ReflectionTestUtils.setField("yourClass", buildProperties, objectBuildProperties)
  • buildProperties 的问题在于,它是从 spring 构建时自动生成的:docs.spring.io/spring-boot/docs/current/reference/html/…
  • 你在测试类中使用@SpringBootTest吗
  • @MebinJoe 不,我使用@WebMvcTest 作为。我也用@SpringBootTest 尝试过,但是MockMvc 没有按预期工作。
  • 你得到了什么异常?

标签: unit-testing spring-boot thymeleaf


【解决方案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,因为mocked bean的所有方法都返回null

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

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

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

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

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

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

【讨论】:

  • 我试过了,但仍然遇到我的 OP 中提到的相同错误。
  • 好的,你的编辑对我有用。为了完整起见,也许添加您可以在测试类中使用@Import(TestConfig.class),这样您就不需要内联它。
  • 如果您想要加分,请将您编辑的答案发布到我的另一个问题(您实际上回答了那个问题而不是这个问题,但我仍然接受了它):stackoverflow.com/questions/54712564/…
【解决方案2】:

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

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

isUnitTest=true

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

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

虽然如果有人找到一种方法来自动实现这一点,我目前还没有找到百里香设置或属性,我会接受它作为答案。

【讨论】:

  • 如果代码作为测试运行,添加额外的测试代码绝不是一个好主意。检查我编辑的答案
  • 是的,我知道这一点,但目前这是一种解决方法。我会检查你的其他建议。
猜你喜欢
  • 2015-03-21
  • 1970-01-01
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
  • 2019-08-17
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多