Конфигурация в модуле тестирования Spring Boot - не удается загрузить ApplicationContext - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь проверить спецификацию c @Service, но не удается загрузить конфигурацию приложений. Я довольно новичок в Spring Boot, так что я просто переживаю боли. Чего мне не хватает?

Мой сервис выглядит так:

@Service
public class Features extends ArrayList<Feature> {

    @Autowired
    private AppConfig config;

    @PostConstruct
    public void loadFeatures() {
        //...
    }
}

Мой класс конфигурации:

@ConfigurationProperties("sample-feature-app")
public class AppConfig {

    private final String packageFeatures;

    @ConstructorBinding
    public AppConfig(String packageFeatures) {
        //...
    }
}

Мой тестовый модуль:

@ContextConfiguration(classes = AppConfig.class)
@SpringBootTest(classes = Features.class)
public class ServiceFeatureTest {

    @Autowired
    Features features;

    @Test
    public void loadFeatures_CheckSize() {
        System.out.println(features.size());
    }
}

Когда я go запускаю тест для loadFeatures_CheckSize(), я получаю ошибку инициализации Spring.

Parameter 0 of constructor in com.example.package.features.ApplicationConfiguration required a bean of type 'java.lang.String' that could not be found.

The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Autowired(required=true)

Action:

Consider defining a bean of type 'java.lang.String' in your configuration.

1 Ответ

0 голосов
/ 23 января 2020

Во-первых, у нас есть класс конфигурации. Здесь код почти равен вашему, но обратите внимание на @Configuration. Эта аннотация сообщает Spring, что класс должен быть выбран при автоматическом сканировании компонента c. Это потому, что он содержит метааннотацию @Component. Аннотация, которую вы используете, @ConfigurationProperties не воспринимается при сканировании компонента, потому что это не аннотация @Component.

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
public class AppConfig {
    // Other bean configurations...
}

Далее @Service. Как я понял, вы заполняете Features данными из файла features.json. Путь к этому файлу сохраняется в файле application.yaml. Я предполагаю, что путь к файлу features.json настроен в ключе конфигурации sample-feature-app. В этом случае вы можете просто сделать это в вашем сервисе:

import com.example.demo.model.Feature;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.ArrayList;

@Service
public class Features extends ArrayList<Feature> {

    @Value("${sample-feature-app}")
    private String packageFeautres;


    @PostConstruct
    public void loadFeatures() {
        // Load the data from features.json ...
    }
}

Конфигурация будет загружена в переменную packageFeatures из-за аннотации @Value, которая вводит конфигурацию, указанную между ${} , В этом случае это будет путь к файлу json. Чтобы закончить, это мой application.yaml файл в каталоге src / main / resources:

sample-feature-app: /path/to/features.json

И в последней части - тест. В тесте вы в основном загружаете «срез», необходимый для теста, который в данном случае является Features классом. Это делается @SpringBootTest(classes = Features.class). Затем вы просто автоматически подключаете этот компонент. И в самом тесте вы утверждаете, больше ли размер 0. Это делается, как указано в комментарии под вашим вопросом, с помощью метода assertTrue JUnit.

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import static org.junit.Assert.assertTrue;

@SpringBootTest(classes = Features.class)
public class ServiceFeatureTest {

    @Autowired
    private Features features;

    @Test
    public void loadFeatures_checkSize() {
        assertTrue(features.size() > 0);
    }
}

Вам не нужно аннотации @ContextConfiguration больше, потому что AppConfig является @Configuration и определяется автоматически (это должно быть, если он находится в подпакете вашего @SpringBootApplication / @SpringBootConfiguration аннотированного основного класса).

...