Как выполнить модульное тестирование (вставку) уровня поставщика данных в Spring Framework? - PullRequest
0 голосов
/ 22 мая 2019

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

пружина 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;
    }

}

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

1 Ответ

0 голосов
/ 22 мая 2019

для весны:

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

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

    @RunWith(SpringJUnit4ClassRunner.class)
    
  • Пружина @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 по тестированию , автоматическое подключение и внедрение зависимостей в тестовые классы не будут работать, если вы не аннотируете тестовый класс двумя отдельными аннотациями:

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

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 {
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...