我试图嘲弄ScheduledExecutorService,我在仿制药方面遇到了麻烦。
这里有一个片段:
ScheduledFuture<?> future = mock(ScheduledFuture.class);
ScheduledExecutorService scheduledExecutorService =
Mockito.mock(ScheduledExecutorService.class);
when(scheduledExecutorService.schedule(Mockito.any(Runnable.class), anyLong(), any(TimeUnit.class))).thenReturn(future);这不会使用以下错误进行编译:
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时没有泛型,那么它编译时会发出警告。
ScheduledFuture future 有什么办法可以正确地解决这个问题吗?我的意思是,我是否可以使用通配符来编译而不需要警告呢?
发布于 2017-11-04 23:17:52
下列工作类型正确:
<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;
}然后打电话给:
ScheduledExecutorService scheduledExecutorService =
mock(ScheduledExecutorService.class);
ScheduledFuture<?> future =
thenReturnMockFuture(
when(scheduledExecutorService.schedule(...)));我认为您也可以这样做(不使用方法,而是使用抽象的本地类):
ScheduledFuture<?> future = mock(ScheduledFutureT.class);
doReturn(future).when(scheduledExecutorService).schedule(...);注意到警告,doReturn并不是类型安全的,所以您只需要确保调用一个确实返回ScheduledFuture<?>的方法。
发布于 2017-11-04 23:28:54
ScheduledFuture中的通配符绑定会导致类型推断问题。需要将future声明为ScheduledFuture<?>吗?
如果不这样做,以下几点将有效:
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()不是类型安全的,所以下面的操作将有效:
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));https://stackoverflow.com/questions/47116539
复制相似问题