2017-02-23 95 views
3

我在我的項目中使用Mockito和Spring框架。@mock註釋與Mockito中的自定義應答類

我有一個測試情況是這樣的:

class SomeTest { 
    @Mock 
    SomeDao dao; 

    @InjectMock 
    TestTarget target; 

    class MyAnswer implements Answer { 
     //some method here 
    } 
} 

我想自定義一個答案類MyAnswerdao

沒有註釋,我可以使用Mockito.mock(Dao.class, new MyAnswer())強制我的模擬對象使用MyAnswer。但是我發現在@Mock註釋中,他們只接受enum Answers內部的參數,如Answers.RETURNS_DEFAULTAnswers.RETURNS_MOCKS

可以強制daoMyAnswer一起使用@Mock註釋嗎?

回答

3

不幸的是,你不得不爲此使用Mockito.mock。目前沒有辦法指定您通過@Mock編寫的答案。

的原因有一點做與的Mockito和一切與Java的註釋規格:

參數只能書寫在一種原始的,字符串,類,枚舉,註釋,或任何數組這些。 (傑森獵人,"Making the Most of Java's Metadata, Part 2: Custom Annotations"

並在Java Language Specification §9.6.1

在註釋類型中聲明必須是以下中的一個,或一個編譯時間誤差的方法的返回類型時:

  • 原始類型
  • 字符串
  • 類或第一個調用(§4.5)
  • 枚舉類型
  • 註釋類型
  • 數組類型,其組件類型是前述類型之一(§10.1)。

因爲註釋類型元素必須是有效的VM-寬常數(包括枚舉值,但不包括任意的情況下),有沒有辦法把你創建一個答案實例。從理論上講,Mockito可以讓你指定一個名爲Answer 的子類,但是Mockito也將負責實例化它,這並不總是可行的,哪些會導致運行時失敗。如果該功能對您來說很重要,您可以考慮製作一個feature request

+0

謝謝你的幫助。它確實幫助我理解Java中的註釋邏輯:) – Liyuan