Как я могу протестировать этот метод init () PostConstruct с помощью контейнера Spring?

Я использую последний плагин spring-boot-gradle-plugin 2.0 для написания модульных тестов. Короче говоря, я хотел написать модульный тест для init () postConstruct в следующем классе:

@Service
public class UserIdService implements IUserIdService
{
    // Local store
    private Map<String, Map<String, String>> store = new TreeMap<>();

    @Autowired
    private ResourceLoader resourceLoader;

    private static final String CSV_FILE_LOCATION = "data/userid-data.csv";

    @PostConstruct
    public void init()
    {
        System.out.println("Loading data from CSV file to UserID Store...");
        int totalRecords = 0;
        Resource resource = resourceLoader.getResource("classpath:" + CSV_FILE_LOCATION);
        try
        {
            InputStream inputStream = resource.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            Iterable<CSVRecord> records = CSVFormat.DEFAULT.parse(inputStreamReader);

            for (CSVRecord record : records)
            {
                totalRecords++;
                String number = record.get(0);
                String context = record.get(1);
                String name = record.get(2);

                number = PhoneNumberHelper.convertPhoneNumber(number);

                //add only valid numbers to store
                if (!number.equals(PhoneNumberHelper.INVALID_INPUT))
                {
                    add(new UserId(name, number, context));
                }
            }
        }
        catch (Exception e)
        {
            System.err.println("Can't load or parse CSV file: " + CSV_FILE_LOCATION);
        }
        System.out.println("Loaded total [ " + store.size() + " / " + totalRecords + " ] records.");
    }

    public boolean add(UserId record)
    {
        if (null == store.get(record.getNumber()))
        {
            Map<String, String> newContext = new TreeMap<>();
            newContext.put(record.getContext(), record.getName());
            store.put(record.getNumber(), newContext);
        }
        else
        {
            Map<String, String> currentContext = store.get(record.getNumber());
            if (currentContext.get(record.getContext()) == null)
            {
                currentContext.put(record.getContext(), record.getName());
            }
            else
            {
                //context already exists for the phone number, throw error
                System.err.println("Context already exists for the phone number: " + record.toString());
                return false;
            }

        }
        return true;
    }

    public List<UserId> get(String number)
    {
        List<UserId> result = new ArrayList<>();

        if (null != store.get(number))
        {
            Map<String, String> currentContext = store.get(number);
            for (Map.Entry<String, String> entry : currentContext.entrySet())
            {
                UserId record = new UserId(entry.getValue(), number, entry.getKey());
                result.add(record);
            }
        }
        return result;
    }

    public boolean contains(String number)
    {
        return store.containsKey(number);
    }

}

Созданный мной тестовый класс выглядит так:

    @SpringBootApplication
    public class UserIdServiceTest {

        @Autowired
        private UserIdService userIdService;

        @Test
        public void testInit() throws Exception {
            userIdService.init();
            // assert things here..
        }

        @Test
        public void testAdd() {
        }

        @Test
        public void testGet() {
        }

        @Test
        public void testContains() {
        }
    }

Когда я пытаюсь запустить его, тест не проходит:

UserIdServiceTest > testInit FAILED java.lang.NullPointerException at UserIdServiceTest.testInit(UserIdServiceTest.java:21)

Я занимаюсь этим несколько дней. Что мне не хватает? - Я хотел бы иметь возможность создавать тесты для описанных методов, но независимо от того, где я ссылаюсь на userIdService, я всегда получаю одно и то же исключение NullPointerException.

Спасибо, что посмотрели.

Разве вам не нужно аннотировать свой тестовый класс с помощью @RunWith(SpringRunner.class) @SpringBootTest

Siraj K 24.05.2018 22:05

Спасибо. К сожалению, он по-прежнему не запускается. Теперь я получаю следующее: «Не удалось загрузить ApplicationContext java.lang.IllegalStateException: не удалось загрузить ApplicationContext». Я хожу по кругу несколько дней. Я перепробовал сотни вещей и комбинаций. Я готов сдаться.

maciekgt3 25.05.2018 00:17
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
21
0

Другие вопросы по теме