Thymeleaf: не визуализировать во время юнит-теста? - PullRequest
0 голосов
/ 22 февраля 2019

Поскольку я не получил ответа на свой другой вопрос здесь , я ищу другой подход.Есть ли способ не выполнять или не включать фрагмент во время модульного тестирования?

Я хочу отобразить версию и номер сборки в нижнем колонтитуле моих шаблонов, поэтому у меня есть следующая строка:

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

Это хорошо работает при запуске приложения, но во время модульного тестирования я получаю исключение:

Нет доступных компонентов с именем buildProperties

В другом вопросеЯ ищу способ получить этот bean-компонент во время модульного тестирования, в качестве альтернативы, я сейчас ищу способ исключить этот шаблон во время юнит-тестов.Примерно так:

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

Я использую следующие аннотации в своем тестовом классе:

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

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Я получил подсказку от коллеги, который работает на этот вопрос.

Просто добавьте application.properties к src/test/resources с пользовательским свойством:

isUnitTest=true

Тогда я могу простопроверьте это в моем шаблоне с чабрецом:

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

Хотя, если кто-то найдет способ достичь этого автоматически с настройкой или свойством тимелина, которые я до сих пор не нашел, я приму его в качестве ответа.

0 голосов
/ 22 февраля 2019

Если это стандартный юнит-тест, используйте Mockito для макета боба:

@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, поскольку все методы проверяемого компонента возвращают null.

, если вы хотите эмулировать реальную версию, вы можете добавить что-то подобное в свой тест или в метод setUp()

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

--------------- edit

К сожалению, все вышеперечисленные решения работают, только если компонент buildProperties был добавлен в модель напрямую.Но в вашем случае вы используете бин напрямую в качестве ссылки на бин SpEL.К сожалению, я не знаю способа проверить, существует ли bean-компонент в контексте через SpEL.Кроме того, не рекомендуется добавлять дополнительный код в ваш код для проверки его работы в тестовом режиме.Поэтому я считаю лучшим решением, если вы создадите вложенный класс конфигурации теста и определите там bean-компонент BuildProperties по умолчанию.

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

Или вы можете использовать @Import(TestConfig.class), если вам нужна дополнительная конфигурация в нескольких классах тестирования.

...