繁体   English   中英

如何在 Spring Framework 中单元测试(插入)数据提供者层?

[英]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 文档所建议的那样,除非您使用两个单独的注释对测试类进行注释,否则测试类中的自动装配和依赖注入将不起作用:

用法示例:

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:

正如有关测试的 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 {
    // ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM