我正在进行一些服务测试,我正在测试一个从使用泛型的类扩展的具体类 .
服务层的示例设置如下:
public abstract class AbstractService {
public void deleteAllItems(E entity) {
List items = new ArrayList(entity.getItems());
for(IT item : items) {
//Yada, yada
}
}
}
public class Service extends AbstractService {
}
public class OtherService() {
@Inject
private ServiceManager serviceManager;
public void deleteItems(Entity e) {
serviceManager.getService().deleteAllItems(e);
}
}
然后测试它我有以下内容:
public class Test {
private Service service;
private OtherService otherService;
private ServiceManager serviceManager;
@BeforeMethod
public void setup() {
serviceManager= mock(serviceManager.class);
service= mock(Service.class);
when(serviceManager.getService()).thenReturn(service);
otherService=injector.getInstance(OtherService.class);
}
@Test
public void test() {
Entity e = new Entity();
//Attach some items
otherService.deleteItems(e);
verify(service).deleteAllItems(e);
}
}
这应该调用 OtherService ,它存在(我们使用注入来获取对象),然后调用方法 deleteItems() ,而后者应该在 Service 上调用 deleteAllItems() . 在我实现Java泛型之前,这很好用,但是由于我已经实现了Java泛型,因此Mockito测试失败并出现以下异常:
java.lang.NoSuchMethodError:Service.deleteAllItems(Entity;)V at Test.test(Test.java:XXX)org.mockito.exceptions.misusing.UnfinishedVerificationException:缺少方法调用验证(mock): - > at Test .test(Test.java:XXX)正确验证的示例:verify(mock).doSomething()此外,此错误可能会显示,因为您验证了:final / private / equals()/ hashCode()方法 . 这些方法无法进行存根/验证 .
听起来似乎无法找到方法 . 我是应该嘲笑 AbstractService 的抽象类还是还有其他我缺少的东西?
EDIT
从我所看到的Mockito内部工作方式来看,它创建了一个这样的实例:
public void AbstractService.deleteAllItems(Entity)
对于 MockitoMethod 对象,这样才有意义 Service.deleteAllItems() "isn't called",看来Mockito假设只调用了基类 . 所以看来我需要模拟基类 . 我对这些建议持开放态度