Как прочитать переменную из application.properties из метода, который тестирует - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть класс:

@Service
public class A {

  @Value("${a.b.c}")
  private String abc;

  public void foo() {
   sout(abc);
  }
}

У меня есть тестовый класс:

@SpringBootTest
@SpringBootConfiguration
@RunWith(SpringRunner.class)
@TestPropertySource(locations = "classpath:application.yml")
public class TestA {

  @Value("${a.b.c}")
  private String abc;

  @InjectMocks
  private A a;

  @Test
  public void testFoo() {
    this.a.foo();
  }
}

Когда я отлаживаю тестовый метод testFoo(), я вижу, что переменная abc читается изфайл application.yml.Но внутри метода foo() я вижу, что переменная abc равна нулю.Как я могу установить переменную abc так, чтобы она была доступна в методе foo(), когда я пытаюсь проверить этот метод?

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Первый шаг - ответить на этот вопрос: тестирую ли я модульное тестирование кода в своем классе или тестирую интеграцию сочетания Spring и некоторого набора кода, который включает в себя мой класс?

Если вы тестируете модульваш код, тогда не нужно, чтобы Spring делал свое дело.Вместо этого вам нужно только создать экземпляр вашего класса, установить значения, которые Spring установил бы для вас, выполнить тестируемый метод, а затем убедиться, что ваш метод выполнен правильно.

Вот ваш примерный тестовый модуль, переписанный какЯ предложил:

public class TestA
{
  private static final String VALUE_ABC = "VALUE_ABC";

  private A classToTest;

  @Test
  public void testFoo()
  {
    classToTest.foo();
  }

  @Before
  public void preTestSetup()
  {
    classToTest = new A();

    ReflectionTestUtils.setField(
      classToTest,
      "abc",
      VALUE_ABC)
  }
}

Некоторые примечания:

  1. ReflectionTestUtils является частью Spring-теста.
  2. Вам не нужно использовать @InjectMocksпотому что у вас нет шуток для инъекций.
  3. Я не знаю, что такое sout, поэтому я исключил его из теста.Вы должны убедиться, что метод sout был вызван с правильным значением (в данном случае VALUE_ABC).
  4. Если вы просто тестируете свой код модулем, вам не нужен Spring, что означает, что вам не нужноиспользовать аннотацию @RunWith.
0 голосов
/ 27 ноября 2018

Вы можете попробовать переопределить свойства следующим образом:

@TestPropertySource(locations = "location.properties",
  properties = "a.b.c=123")

Пример взят из здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...