Java 来自超类方法调用的Mockito NullPointerException

Java 来自超类方法调用的Mockito NullPointerException,java,spring,mockito,junit4,Java,Spring,Mockito,Junit4,我有以下精简的类(为了简单起见,让我们假设服务接口只有一个重写方法)。无论我尝试什么,当serviceinpl调用getSqlSession()时,我总是会得到一个NullPointerException。如何覆盖此调用以避免异常?我已尝试创建一个spy ServiceImpl,并在方法getSqlSession()上调用时调用,但仍然出现异常。我不想将逻辑放在serviceinpl.getData()中,该逻辑将列表更改为映射到测试类中,因为如果此实现发生更改,测试代码也需要更改。有什么建议吗

我有以下精简的类(为了简单起见,让我们假设服务接口只有一个重写方法)。无论我尝试什么,当
serviceinpl
调用
getSqlSession()
时,我总是会得到一个NullPointerException。如何覆盖此调用以避免异常?我已尝试创建一个spy ServiceImpl,并在方法
getSqlSession()
上调用
时调用
,但仍然出现异常。我不想将逻辑放在
serviceinpl.getData()
中,该逻辑将
列表
更改为
映射
到测试类中,因为如果此实现发生更改,测试代码也需要更改。有什么建议吗

public class ServiceImpl extends BaseService implements Service {

    @Autowired
    private ServiceDAO serviceDao;

    @Override
    public Map<String, Object> getData() {
        Map<String,Object> map = new HashMap<String,Object>();
        List<Object> resultSet = service.getData(getSqlSession());
        map.put("Test", resultSet.get(0));
        map.put("Test2", resultSet.get(1));

        return map;
    }

   public void setServiceDao(final ServiceDAO serviceDao) {
     this.serviceDao = serviceDao;
   }

}

public class ServiceDAO {
    public List<Object> getData(SqlSession sqlSession) {
        return sqlSession.selectList("proc_name");
    }
}
公共类ServiceDAO{
公共列表getData(SqlSession SqlSession){
返回sqlSession.selectList(“proc_name”);
}
}
和测试类:

public class ServiceImplTest {

    private Service service;

    @Mock
    private ServiceDAO serviceDao;

    @Before
    public void before() {
        MockitoAnnotations.initMocks(this);
        service = new ServiceImpl();
        service.serviceDao = this.serviceDao;
    }

    @Test
    public void testGetData() {
        Mockito.when(service.getData()).then(new Answer<List<Object>>() {

        @Override
        public List<Object> answer(InvocationOnMock invocation) throws Throwable {
            return serviceDAO.getData(new DefaultSqlSession(null,null));

        }

    });

        service.getData();

    }
}
公共类ServiceImplTest{
私人服务;
@嘲弄
私人服务;
@以前
在()之前公开无效{
initMocks(this);
服务=新的ServiceImpl();
service.serviceDao=this.serviceDao;
}
@试验
public void testGetData(){
Mockito.when(service.getData()).then(new-Answer()){
@凌驾
公共列表应答(invocationMock调用)抛出可丢弃的{
返回serviceDAO.getData(新的DefaultSqlSession(null,null));
}
});
service.getData();
}
}

我相信当您尝试从服务中使用serviceDao时会发生错误:

List<Object> resultSet = service.getData(getSqlSession());

终于能够在下面的测试类中使用它。不得不将
服务
声明从接口更改为实际的Impl类。不确定是否有办法解决这个问题,因为所有其他尝试都没有成功

public class ServiceImplTest {

    @Mock
    private ServiceDAO serviceDAO;

    @Spy
    private ServiceImpl service;

    @Before
    public void before() {
        MockitoAnnotations.initMocks(this);
        //service = new ServiceImpl();
        service.setServiceDAO(this.serviceDAO);
    }

    @Test
    public void testGetData() {
        Mockito.doAnswer(new Answer<SqlSession>(){

            @Override
            public SqlSession answer(InvocationOnMock invocation) throws Throwable {
                return new DefaultSqlSession(null,null);
            }

        }).when(service).getSqlSession();

        Mockito.when(service.getData()).then(new Answer<List<Object>>() {

        @Override
        public List<Object> answer(InvocationOnMock invocation) throws Throwable {
            return serviceDAO.getData(new DefaultSqlSession(null,null));

        }

    });

        service.getData();

    }

}
公共类ServiceImplTest{
@嘲弄
私人服务;
@间谍
私人服务impl服务;
@以前
在()之前公开无效{
initMocks(this);
//服务=新的ServiceImpl();
service.setServiceDAO(this.serviceDAO);
}
@试验
public void testGetData(){
Mockito.doAnswer(新答案(){
@凌驾
公共SqlSession应答(InvocationMock调用)抛出可丢弃的{
返回新的DefaultSqlSession(null,null);
}
}).when(service).getSqlSession();
Mockito.when(service.getData()).then(new-Answer()){
@凌驾
公共列表应答(invocationMock调用)抛出可丢弃的{
返回serviceDAO.getData(新的DefaultSqlSession(null,null));
}
});
service.getData();
}
}

may be@Spy annotation will help最终能够使用Spy实现这一功能,感谢感谢感谢它的帮助我假设您的意思是
service.serviceDAO=this.serviceDAO我也试过了。不,我的意思是“服务。服务”在你的服务中。Dao被称为“服务”,我相信这个类是空的?你到底从哪里得到异常?对不起,你是对的。编辑了上面的代码以澄清,并在中添加了您的更改(以表明我已经尝试过)。但对我来说,我还是有例外。每次调用
service.getData(getSqlSession())
@Before
public void before() {
    MockitoAnnotations.initMocks(this);
    service = new ServiceImpl();
    service.service = this.serviceDAO;
}
public class ServiceImplTest {

    @Mock
    private ServiceDAO serviceDAO;

    @Spy
    private ServiceImpl service;

    @Before
    public void before() {
        MockitoAnnotations.initMocks(this);
        //service = new ServiceImpl();
        service.setServiceDAO(this.serviceDAO);
    }

    @Test
    public void testGetData() {
        Mockito.doAnswer(new Answer<SqlSession>(){

            @Override
            public SqlSession answer(InvocationOnMock invocation) throws Throwable {
                return new DefaultSqlSession(null,null);
            }

        }).when(service).getSqlSession();

        Mockito.when(service.getData()).then(new Answer<List<Object>>() {

        @Override
        public List<Object> answer(InvocationOnMock invocation) throws Throwable {
            return serviceDAO.getData(new DefaultSqlSession(null,null));

        }

    });

        service.getData();

    }

}