如何在Spring框架中对数据提供者层进行单元测试(插入)?

时间:2019-05-22 08:16:28

标签: java spring unit-testing mocking

当我在单元测试的数据提供者层上调用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;
    }

}
我希望可以插入数据并正常读取数据。 但是在插入方法上会发生空指针异常。

1 个答案:

答案 0 :(得分:0)

对于春季:

the Spring documentation on testing suggests一样,除非您使用两个单独的注释对测试类进行注释,否则测试类中的自动装配和依赖项注入将不起作用:

用法示例:

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:

正如the Spring Boot documentation on testing所建议的那样,除非您使用两个单独的注释对测试类进行注释,否则测试类中的自动装配和依赖注入将不起作用:

用法示例:

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 {
    // ...
}