2012-11-12 34 views
2

這是一個非常新手的問題,但我不知道如何存根。如何使用然後返回課程?

我必須模擬一個方法來返回類像這樣。

public Class<? extends SomeClass> getAClass(); 

,如果我做這樣的事情

when(this.someInstance.getAClass()) 
    .thenReturn(SomeClassThatExtendsSomeClass.class); 

我得到的編譯錯誤。

The method thenReturn(Class<capture#1-of ? extends SomeClass>) in the type OngoingStubbing<Class<capture#1-of ? extends SomeClass>> is not applicable for the arguments (Class<SomeClassThatExtendsSomeClass>) 
+2

你得到的錯誤是什麼? – mikej

+0

然後返回類型爲OngoingStubbing )。 extends SomeClass >>不適用於參數(Class ) – toy

+0

SomeClassThatExtendsSomeClass的定義是什麼樣子? –

回答

4

如果方法聲明中可以改變什麼@Bohemian以上建議,

public <T extends SomeClass> Class<T> getAClass(); 

,那麼你可以寫你的mock聲明如下:

when(this.someInstance.<SomeClassThatExtendsSomeClass>getAClass()) 
    .thenReturn(SomeClassThatExtendsSomeClass.class); 

Oth erwise的doReturn語義應使用如下:

Mockito 
    .doReturn(SomeClassThatExtendsSomeClass.class) 
    .when(this.someInstance.<SomeClassThatExtendsSomeClass>getAClass()); 
+0

如果我不能更改方法聲明怎麼辦? – toy

+0

然後,在使用'when()。thenReturn()'語義時,應該使用較少的類型安全的'doReturn()'語義來避免編譯器錯誤。 – Vikdor

0

嘗試鍵入方法:

public <T extends SomeClass> Class<T> getAClass(); 

when(this.someInstance.getAClass()) 
    .thenReturn(SomeClassThatExtendsSomeClass.class); 
+0

然後錯誤是'thenReturn(Class )不適用於參數類'。 – Vikdor

2

如果你不能改變的方法聲明,使其與thenReturn工作,那麼你可以使用thenAnswer

when(this.someInstance.getAClass()).thenAnswer(new Answer<Class<? extends SomeClass>>() { 
      @Override 
      public Class<? extends SomeClass> answer(InvocationOnMock invocation) throws Throwable { 
       return SomeClassThatExtendsSomeClass.class; 
      } 
}); 

雖然它不是如果僅僅爲了返回一個固定的值而執行Answer是不理想的,這應該適用於您的場景。

相關問題