2017-11-04 7 views
2

私はScheduledExecutorServiceをモックしようとしていますが、ジェネリックに問題があります。私はジェネリックなしScheduledFutureを宣言する場合は、警告をコンパイルし、Java Generics:<?>対キャプチャ<?>

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<?> future = mock(ScheduledFuture.class); 

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

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

これは、次のエラーでコンパイルできません:

はここでスニペットです。

ScheduledFuture future 

正しい方法はありますか?つまり、警告なしでコンパイルするようなワイルドカードはありますか?

答えて

4

タイプ-正しく、次の作品:次に

<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(...); 

注記あなたがScheduledFuture<?>を返すメソッドを呼び出していることを確認しておきましょう。

3

ScheduledFutureにバインドされたワイルドカードは、型推論に問題を引き起こします。 futureScheduledFuture<?>と宣言するのに、が必要ですか?

ない場合は、次のように動作します:

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); 

doReturn()がタイプセーフではありませんので、あなたは以下が動作するScheduledFuture<?>としてfutureを宣言する必要がある場合:

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)); 
関連する問題