Использование внедрения свойств Spring без необходимости запуска всего контекста - PullRequest
4 голосов
/ 24 октября 2019

Я хочу запустить некоторые модульные тесты без необходимости в контексте Spring по соображениям скорости. Но мне также нравится, как я могу вставлять файлы в свои тесты

Вот пример тестового кода, который я использую:

@ContextConfiguration()
@SpringBootTest
@RunWith(SpringRunner.class)
public class XmlRestructureApplierTest {
  @Value("classpath:export.xml")
  private Resource exportedXML;
  private XmlRestructureApplier applier;


  @Test
  public void shouldRestructureArrayToObjectWithGivenKey() throws IOException, XPathExpressionException, SAXException {
    List<JSONObject> productsAsJSONObjects = XmlElementExtractor.extractToJSON(exportXML.getInputStream(), "PRV");
    assertThat(productsAsJSONObjects).hasSize(6);
  }
}

Я хотел бы иметь только удобный способ использования @Value без запуска всего трудоемкого контекста.

Возможно ли это как-то?

1 Ответ

2 голосов
/ 24 октября 2019

Вы можете использовать тестовую пустую конфигурацию для такого теста, это улучшит производительность. В следующем примере @SpringBootTest загружает только встроенный EmptyTestContext вместо поиска всех SpringBootConfiguration:

@SpringBootTest
@RunWith(SpringRunner.class)
public class DemoMvcApplicationTest {
    @Value("${test.value}")
    private String value;

    @Test
    public void propertyHasValidValue() {
        assertThat(value).isEqualTo("TestValue1");
    }

    @Configuration
    public static class EmptyTestContext {}
}

Также для большей читабельности можно добавить:

@SpringBootTest(classes = DemoMvcApplicationTest.EmptyTestContext.class)

Имеетсятот же эффект.

Обновление , более легкий вариант:

@RunWith(SpringRunner.class)
@ContextConfiguration
public class DemoMvcApplicationTest {
    @Value("${test.value}")
    private String value;

    @Test
    public void propertyHasValidValue() {
        assertThat(value).isEqualTo("TestValue1");
    }

    @Configuration
    @PropertySource("classpath:application.properties")
    public static class EmptyTestContext {}
}
...