2012-05-26 50 views
7

我目前正在編寫一些涉及JMock的測試。我無法理解的代碼結構如下:JMock - 添加期望的奇怪語法

context.checking(new Expectations() { //context is of type Mockery of course 
      { 
       allowing(csv).getFileName(); 
       will(returnValue(fileName)); 
      } 
     }); 

慢慢分析,據我所知,

context.checking(new Expectations() { ... } 

這將產生Expectations的anonoymous instantiateion。但是爲什麼我們在這之後有另一個括號,然後是一些奇怪的靜態我相信,諸如允許()等方法?如果有人能夠從Java角度向我解釋發生了什麼,我將非常感激。

回答

6

第二組大括號形成一個instance initialization block,其代碼由編譯器複製到該類的每個構造函數中。這使您可以訪問實例成員。就JMock的API而言,它提供了初始化期望的簡潔方法。您可以通過模板方法實現相同的功能(儘管在編譯Expectations本身時出現關於對構造函數的可重寫方法進行不安全調用的警告)。

public abstract class Expectations { 
    public Expectations() { 
     buildExpectations(); 
    } 

    protected abstract void buildExpectations(); 

    ... 
} 

並在測試

context.checking(new Expectations() { 
    protected void buildExpectations() { 
     allowing(csv).getFileName(); 
     will(returnValue(fileName)); 
    } 
}); 

我肯定更喜歡較短的版本。 :)

1

有些人認爲,建立在靜態initialisers預期,靜態方法 提供很酷,簡潔,流暢,易讀的語法指定的預期 - 我同意他們的觀點。尷尬的語法不僅是嘲諷框架中很酷的事情 - 引擎蓋下有很多很酷的字節碼操作。

+1

不是真的回答我的問題,我很害怕 – Bober02

6

實例初始值設定項很有趣。他們只有我真的看到他們使用很多與JMock。考慮一個更簡單,更容易理解的上下文。您可以創建地圖並添加項目:

Map<String,String> map = new HashMap<String,String>(){ 
    { 
     put("One","Something"); 
     put("Two","Other"); 
    } 
}; 

也許這會幫助您瞭解JMock正在做的事情。