Я получаю исключение нулевого указателя, когда я вызываю метод вставки на уровне поставщика данных модульного теста. И при вызове метода вставки в основном методе в файле реализации поставщика возникает исключение нулевого указателя.
Почему возникает исключение нулевого указателя? 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;
}
}
я ожидаю, что данные могут быть вставлены и прочитаны в обычном режиме. но при методе вставки возникает исключение нулевого указателя.
Как документация 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 {
// ...
}
Я попытался использовать @RunWith(MockitoJUnitRunner.class) в testFile.java и использовать аннотацию @Mock в картографе. Тогда исключение нулевого указателя не возникает, но значение не сохраняется в фактической базе данных.. (очевидно?) Я не знаю, как найти сохраненное значение и написать тестовый пример. (Устаревший маппер/вставка, маппер обновлений отличается.)
Привет @Jays, я отредактировал свой вопрос, чтобы отразить это. Извините, я неправильно прочитал это изначально.
Привет @Paul Benn, все в порядке. Я просто ценю ваши комментарии.
спасибо, но моя тестовая среда - это не весенняя загрузка, это просто весенняя структура..