首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java:<?>与capture<?>

Java:<?>与capture<?>
EN

Stack Overflow用户
提问于 2017-11-04 23:11:32
回答 2查看 577关注 0票数 2

我试图嘲弄ScheduledExecutorService,我在仿制药方面遇到了麻烦。

这里有一个片段:

代码语言:javascript
复制
ScheduledFuture<?> future = mock(ScheduledFuture.class);

ScheduledExecutorService scheduledExecutorService = 
Mockito.mock(ScheduledExecutorService.class);

when(scheduledExecutorService.schedule(Mockito.any(Runnable.class), anyLong(), any(TimeUnit.class))).thenReturn(future);

这不会使用以下错误进行编译:

代码语言:javascript
复制
Error:(20, 109) java: no suitable method found for 
  thenReturn(java.util.concurrent.ScheduledFuture<capture#1 of ?>)
method org.mockito.stubbing.OngoingStubbing.thenReturn(java.util.concurrent.ScheduledFuture<capture#2 of ?>) is not applicable
  (argument mismatch; java.util.concurrent.ScheduledFuture<capture#1 of ?> cannot be converted to java.util.concurrent.ScheduledFuture<capture#2 of ?>)
method org.mockito.stubbing.OngoingStubbing.thenReturn(java.util.concurrent.ScheduledFuture<capture#2 of ?>,java.util.concurrent.ScheduledFuture<capture#2 of ?>...) is not applicable
  (argument mismatch; java.util.concurrent.ScheduledFuture<capture#1 of ?> cannot be converted to java.util.concurrent.ScheduledFuture<capture#2 of ?>)

如果我声明ScheduledFuture时没有泛型,那么它编译时会发出警告。

代码语言:javascript
复制
 ScheduledFuture future 

有什么办法可以正确地解决这个问题吗?我的意思是,我是否可以使用通配符来编译而不需要警告呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-04 23:17:52

下列工作类型正确:

代码语言:javascript
复制
<T> ScheduledFuture<?> thenReturnMockFuture(
    OngoingStubbing<ScheduledFuture<T>> stubbing) {
  // Declare a local abstract class, so that future is type-correct.
  abstract class ScheduledFutureT implements ScheduledFuture<T> {}
  ScheduledFuture<T> future = mock(ScheduledFutureT.class);

  stubbing.thenReturn(future);
  return future;
}

然后打电话给:

代码语言:javascript
复制
ScheduledExecutorService scheduledExecutorService = 
    mock(ScheduledExecutorService.class);

ScheduledFuture<?> future = 
    thenReturnMockFuture(
        when(scheduledExecutorService.schedule(...)));

我认为您也可以这样做(不使用方法,而是使用抽象的本地类):

代码语言:javascript
复制
ScheduledFuture<?> future = mock(ScheduledFutureT.class);
doReturn(future).when(scheduledExecutorService).schedule(...);

注意到警告doReturn并不是类型安全的,所以您只需要确保调用一个确实返回ScheduledFuture<?>的方法。

票数 4
EN

Stack Overflow用户

发布于 2017-11-04 23:28:54

ScheduledFuture中的通配符绑定会导致类型推断问题。需要将future声明为ScheduledFuture<?>吗?

如果不这样做,以下几点将有效:

代码语言:javascript
复制
ScheduledFuture future = Mockito.mock(ScheduledFuture.class);

ScheduledExecutorService scheduledExecutorService =
        Mockito.mock(ScheduledExecutorService.class);

Mockito.when(scheduledExecutorService.schedule(Mockito.any(Runnable.class), Mockito.anyLong(), Mockito.any(TimeUnit.class))).thenReturn(future);

如果您确实需要将future声明为ScheduledFuture<?>,那么由于doReturn()不是类型安全的,所以下面的操作将有效:

代码语言:javascript
复制
ScheduledFuture<?> future = Mockito.mock(ScheduledFuture.class);

ScheduledExecutorService scheduledExecutorService =
        Mockito.mock(ScheduledExecutorService.class);

Mockito.doReturn(future).when(scheduledExecutorService).schedule(Mockito.any(Runnable.class), Mockito.anyLong(), Mockito.any(TimeUnit.class));
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47116539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档