[英]How do I unit test(insert) the data provider layer in the Spring Framework?
当我在单元测试的数据提供者层上调用 insert 方法时,我得到一个空指针异常。 并且在提供者实现文件的main方法中调用insert方法时,会出现空指针异常。
为什么会出现空指针异常? Mapper 不适用@Autowired?
spring 5.1.6、mybatis 3.5.1、junit 4.12 mockito-core 2.23.4
我尝试创建一个宁静的 API 并进行检查。 插入方法正常工作。 我在 testFile.java 上使用了 @RunWith(MockitoJUnitRunner.class) 并在映射器上使用了 @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);
}
}
测试.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)
来自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 {
// ...
}
正如有关测试的 Spring Boot 文档所建议的那样,除非您使用两个单独的注释对测试类进行注释,否则测试类中的自动装配和依赖注入将不起作用:
JUnit @RunWith
注解,使用SpringRunner
类:
@RunWith(SpringRunner.class)
来自spring-boot-starter-test
Maven 依赖项的@SpringBootTest
注释:
@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 {
// ...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.