Модульное тестирование класса конфигурации, не работающего в проекте Multi Maven Spring Boot - PullRequest
2 голосов
/ 15 февраля 2020

Я работаю над мультимодульным проектом maven с платформой SpringBoot. Проект разделен на 4 модуля: модуль отдыха, сервисный модуль, модуль репозитория, модуль домена. Я пытаюсь написать модульный тест для класса конфигурации в java, который находится в сервисном модуле. Я упростил дело, чтобы избавиться от сложности бизнес логики c. Класс конфигурации выглядит следующим образом:

@Configuration
@ConfigurationProperties(prefix = "x.y.feature", ignoreInvalidFields = false)
public class FeatureConfig {

        private String featureUrl;

        public String getFeatureUrl() {
            return featureUrl;
        }

        public void setFeatureUrl(String FeatureUrl) {
            this.featureUrl = featureUrl;
        }

}

Файл свойств это application.properties.

x.y.feature.featureUrl=featureUrl

А ниже приведен неработающий модульный тест.

@RunWith(SpringRunner.class)
@SpringBootTest(classes = { FeatureConfigTest.class })
public class FeatureConfigTest {
    @Autowired
    private FeatureConfig featureConfig;

    @Test
    public void testgetFeatureUrl() {
        String expected ="featureUrl";
        assertEquals(expected,featureConfig.getFeatureUrl());
    }
}

Когда я запускаю модульный тест, выдается следующее исключение:

java.lang.IllegalStateException: Failed to load ApplicationContext
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:125)
    at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:108)

1 Ответ

3 голосов
/ 15 февраля 2020

Проблема в том, что вы пытаетесь использовать объект FeatureConfig из контекста приложения. Вы не инициализировали контекст приложения. Когда вы используете аннотацию @Autowire, вы отображаете поле featureConfig с экземпляром класса FeatureConfig, расположенным в контексте приложения. Чтобы обойти эту ошибку, вам нужно инициализировать контекст приложения.

Прежде всего, создайте класс stati c внутри тестового класса, который поможет нам не загружать весь контекст приложения. Потому что для этого теста вам не нужно загружать все приложение. Прежде всего, создайте класс stati c внутри тестового класса, который поможет нам не загружать весь контекст приложения. Потому что для этого теста вам не нужно загружать все приложение.

    @EnableConfigurationProperties(FeatureConfig.class)
    public static class TestConfiguration {
    }

После этого вы запускаете контекст приложения, но с передачей в качестве конфигурации созданного вами класса stati c. Это сделано для того, чтобы не загружать весь контекст приложения.

@SpringBootTest(classes = { FeatureConfigTest.TestConfiguration class })

Скопируйте и вставьте указанные ниже изменения в свой тестовый класс, и все должно работать нормально.

@RunWith(SpringRunner.class)
@SpringBootTest(classes = { FeatureConfigTest.TestConfiguration class })
public class FeatureConfigTest {
    @Autowired
    private FeatureConfig featureConfig;

    @Test
    public void testgetFeatureUrl() {
        String expected ="featureUrl";
        assertEquals(expected,featureConfig.getFeatureUrl());
    }

    @EnableConfigurationProperties(FeatureConfig.class)
    public static class TestConfiguration {
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...