当我在单元测试的数据提供者层上调用insert方法时,我得到一个空指针异常。并且,当在提供程序实现文件的main方法中调用insert方法时,会出现空指针Exception。 为什么会出现空指针异常?映射器不适用于@Autowired吗?
spring 5.1.6,mybatis 3.5.1,junit 4.12,mockito-core 2.23.4
我试图创建一个宁静的API并进行检查。 insert方法可以正常工作。 我在testFile.java上使用@RunWith(MockitoJUnitRunner.class),在映射器上使用了@Mock注释。 然后,不会发生空指针异常,但是该值未存储在实际的数据库中(显然吗?) 我不知道如何查找存储的值并编写测试用例。 (retireve映射器/插入,更新映射器是不同的。)
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;
}
}
我希望可以插入数据并正常读取数据。
但是在插入方法上会发生空指针异常。
答案 0 :(得分:0)
与the Spring documentation on testing suggests一样,除非您使用两个单独的注释对测试类进行注释,否则测试类中的自动装配和依赖项注入将不起作用:
使用@RunWith
类的JUnit 4 SpringJUnit4ClassRunner
批注:
@RunWith(SpringJUnit4ClassRunner.class)
来自org.springframework.test
软件包的Spring @ContextConfiguration
批注:
@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 {
// ...
}
正如the Spring Boot documentation on testing所建议的那样,除非您使用两个单独的注释对测试类进行注释,否则测试类中的自动装配和依赖注入将不起作用:
使用SpringRunner类的JUnit @RunWith
批注:
@RunWith(SpringRunner.class)
来自Maven依赖项@SpringBootTest
的spring-boot-starter-test
批注:
@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 {
// ...
}