Java Mockito-存根超级(抽象)类方法

Java Mockito-存根超级(抽象)类方法,java,junit,mocking,mockito,Java,Junit,Mocking,Mockito,我的DAO代码如下所示: public abstract class GenericDAO <T, I> { public I upsert(T entity){ //implementation } } public class MyEntityDAO extends GenericDAO <MyEntity, Integer> { public List<MyEntity> searchMyEntity(Searc

我的DAO代码如下所示:

public abstract class GenericDAO <T, I> {
    public I upsert(T entity){
        //implementation
    }
}

public class MyEntityDAO extends GenericDAO <MyEntity, Integer> {
    public List<MyEntity> searchMyEntity(SearchParameters params){
        //domain specific entity search
    }
}

public class MyEntityService{
    private MyEntityDAO myEntityDAO;

    public Integer saveMyEntity(MyEntityVO vo){
        //transform vo to entity with business logic
        return myEntityDAO.upsert(myEntityInstance);
    }        

}
这是有效的代码:

Mockito.when(myEntityDAO.searchMyEntity(testSearchParams))
            .thenReturn(mockedListOfMyEntities);

似乎因为upsert()在MyEntityDAO的超类中,而不是在MyEntityDAO本身中,所以这个问题即将出现。我有什么办法可以做到这一点吗?是否有任何变通方法或其他框架支持此功能?

已在评论中解决:

似乎问题在于使用void更新的方法。。必须使用Answer修改传递的对象以测试功能


如果我理解正确的话,第一个mockito样本就是失败的,对吗?我试图复制粘贴您的代码,并创建了一个自己的测试,它似乎在这里工作得非常好。可能是另一个模拟导致了错误吗?它确实抱怨void参数,并且您的代码示例在任何地方都没有使用void。关于void参数的消息在eclipse Juno中是一个错误(我的JDK版本是8,但设置为1.6)。您使用的是什么IDE?我测试的环境是spring工具套件3.4.0,构建在Eclipse4.3.1上,java7设置为Java6。但我不认为这是一个版本问题。编译器告诉我们Mockito.when()方法不能接受void作为参数。如果我将upsert方法的签名更改为
void upsert(..)
我会得到与您相同的编译错误,因为两个类都有返回void的
upsert
重载?MyEntityDAO的任何超类都是非公共的吗?你可能会遇到。
Mockito.when(myEntityDAO.searchMyEntity(testSearchParams))
            .thenReturn(mockedListOfMyEntities);