Как выполнить модульное тестирование (вставить) уровень поставщика данных в Spring Framework?

Я получаю исключение нулевого указателя, когда я вызываю метод вставки на уровне поставщика данных модульного теста. И при вызове метода вставки в основном методе в файле реализации поставщика возникает исключение нулевого указателя.

Почему возникает исключение нулевого указателя? Mapper не применяет @Autowired?

spring 5.1.6, mybatis 3.5.1, junit 4.12 mockito-core 2.23.4

Я попытался создать спокойный API и проверить. метод вставки работает правильно. И я использовал @RunWith(MockitoJUnitRunner.class) в testFile.java и использовал аннотацию @Mock в картографе.

Тогда исключение нулевого указателя не возникает, но значение не сохраняется в фактической базе данных.. (очевидно?)

Я не знаю, как найти сохраненное значение и написать тестовый пример. (Преобразователь извлечения/вставки, сопоставления обновлений отличается.)

DataCollectProviderImpl.java

@Component
public class DataCollectProviderImpl implements DataCollectProvider {

    @Autowired
    private DataCollectMapper dataCollectMapper;

    @Override
    public String registerCollectData(HospitalDataCollectionInfo hospitalDataCollectionInfo) {
        dataCollectMapper.insertCollectData(hospitalDataCollectionInfo); <---null pointer exception
        return hospitalDataCollectionInfo.getDataCollectId();
    }

    public static void main(String[] args) {
        DataCollectProvider dcp = new DataCollectProviderImpl();
        HospitalDataCollectionInfo hospitalDataCollectionInfo = new HospitalDataCollectionInfo();
        hospitalDataCollectionInfo.setDataCollectId("Testtttt");
        hospitalDataCollectionInfo.setDiseaseCode("A");
        hospitalDataCollectionInfo.setDataStateCode("1");
        hospitalDataCollectionInfo.setHospitalCode("A");
        hospitalDataCollectionInfo.setCollectedCount(1);
        hospitalDataCollectionInfo.setCollectedCount(1);
        hospitalDataCollectionInfo.setBaseDateTime("123456");
        hospitalDataCollectionInfo.setBaseDateTimeSequence(1);
        hospitalDataCollectionInfo.setCollectEndDateTime("1234");
        hospitalDataCollectionInfo.setCollectStartDateTime("1234");
        hospitalDataCollectionInfo.setCreateDateTime("123");
        hospitalDataCollectionInfo.setUpdateDateTime("123");
        dcp.registerCollectData(hospitalDataCollectionInfo);
    }
}

test.java

public class DataCollectProviderTest {

    @Autowired
    private DataCollectMapper dataCollectMapper;

    @Test
    public void registerCollectDataTest() {
        HospitalDataCollectionInfo insertData = (HospitalDataCollectionInfo) setClassFields(new HospitalDataCollectionInfo());
        dataCollectMapper.insertCollectData(insertData); <---null pointer exception

    }

    private Object setClassFields(Object object) {
        try {
            Class clazz = object.getClass();
            Field[] fields = clazz.getDeclaredFields();
            for (int i = 0; i < fields.length; i++) {
                Field field = fields[i];
                field.setAccessible(true);
                if (field.getType() == Integer.TYPE) {
                    field.set(object, i);
                } else {
                    field.set(object, "Test" + (999 - i));
                }
            }

            return clazz.cast(object);
        } catch (IllegalAccessException e) {
                e.printStackTrace();
        }

        return null;
    }

}

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

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

Ответы 1

Ответ принят как подходящий

На весну:

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

  • Аннотация JUnit 4 @RunWith с использованием класса SpringJUnit4ClassRunner:

    @RunWith(SpringJUnit4ClassRunner.class)
    
  • Аннотация Spring @ContextConfiguration из пакета org.springframework.test:

    @ContextConfiguration(locations = { "/applicationContext_mock.xml" })
    

Пример использования:

import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.boot.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/applicationContext_mock.xml" })
public class DataCollectProviderTest {
    // ...
}

Для весенней загрузки:

Как предполагает документация Spring Boot по тестированию, автоматическое связывание и внедрение зависимостей в тестовых классах не будут работать, если вы не аннотируете тестовый класс двумя отдельными аннотациями:

  • Аннотация JUnit @RunWith с использованием класса SpringRunner:

    @RunWith(SpringRunner.class)
    
  • Аннотация @SpringBootTest из зависимости spring-boot-starter-test Maven:

    @SpringBootTest
    

Пример использования:

import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class DataCollectProviderTest {
    // ...
}

спасибо, но моя тестовая среда - это не весенняя загрузка, это просто весенняя структура..

Jays 22.05.2019 10:25

Я попытался использовать @RunWith(MockitoJUnitRunner.class) в testFile.java и использовать аннотацию @Mock в картографе. Тогда исключение нулевого указателя не возникает, но значение не сохраняется в фактической базе данных.. (очевидно?) Я не знаю, как найти сохраненное значение и написать тестовый пример. (Устаревший маппер/вставка, маппер обновлений отличается.)

Jays 22.05.2019 10:32

Привет @Jays, я отредактировал свой вопрос, чтобы отразить это. Извините, я неправильно прочитал это изначально.

Paul Benn 22.05.2019 10:33

Привет @Paul Benn, все в порядке. Я просто ценю ваши комментарии.

Jays 22.05.2019 10:37

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