2009-07-14 72 views
1

我們終於從遷移的JUnit 3我們的單元測試代碼庫中的JUnit 4支持基類的我們也大量使用JMock的2缺乏在Junit4/Jmock2

的在JUnit 3,JMock的提供了一個有用的測試基類(MockObjectTestCase),它本身也是Junit TestCase的子類,它處理有關模擬框架的各種內務職責。它讓測試課變得非常容易。

現在使用JUnit4,JMock不提供這種支持。你的測試類必須手動創建一個Mockery對象,它必須記住使用正確的測試運行器註釋,並且必須將所有與模擬相關的操作委託給嘲笑。簡而言之,它對測試類的責任遠遠超過JUnit 3測試所需的責任。

現在我明白JUnit4的一部分魅力在於不需要繼承某些東西,但是這種JMock情況看起來像是倒退了一步,並且使得從3移植到4應該比應該需要更多的工作。

我錯過了什麼嗎?實際上是否有一種很好的方式來編寫我的JUnit4/Jmock2測試類,而無需手動將所有管道添加到每個類?當然,我可以編寫自己的支持基類,但似乎JMock2 API中有一個明顯的漏洞,我不得不懷疑我是否錯過了這一點。


編輯:這裏有一個可選的支持類會是什麼樣子的源代碼:

@RunWith(JMock.class) 
public class JMockSupport { 

    protected final Mockery mockery = new Mockery(); 

    protected void checking(ExpectationBuilder expectations) { 
     mockery.checking(expectations); 
    } 

    protected <T> T mock(Class<T> typeToMock) { 
     return mockery.mock(typeToMock); 
    } 

    protected <T> T mock(Class<T> typeToMock, String name) { 
     return mockery.mock(typeToMock, name); 
    } 

    protected Sequence sequence(String name) { 
     return mockery.sequence(name); 
    } 

    protected void setDefaultResultForType(Class<?> type, Object result) { 
     mockery.setDefaultResultForType(type, result); 
    } 

    protected void setImposteriser(Imposteriser imposteriser) { 
     mockery.setImposteriser(imposteriser); 
    } 

    protected void setNamingScheme(MockObjectNamingScheme namingScheme) { 
     mockery.setNamingScheme(namingScheme); 
    } 

    protected States states(String name) { 
     return mockery.states(name); 
    } 
} 

這包含了所有的JUnit3 MockObjectTestCase類中定義的方法,這只是呼應的嘲弄。 @RunWith註解也在那裏,以避免忘記將其添加到測試類中的可能性。

回答

1

有基類也有問題。在以前的版本中,我嘗試將來自不同測試框架的基類進行組合。這就是爲什麼我們要繼承構圖。看看我們能用新的@Rule結構做什麼會很有趣。

+0

我同意構圖的靈活性非常高,但是繼承帶來了方便。能夠挑選是很好的。 – skaffman 2009-09-05 21:06:18

1

不。沒有這種支持。

JMock 1中的測試基類導致了很多問題,因爲您只能擴展一個類,因此人們無法將JMock與定義基類的其他測試框架一起使用。這就是爲什麼我們在JMock2中使用委託而不是繼承。這就是說,只要你用@RunWith(JMock.class)註解你的類,你就可以使用JMock2的JUnit3支持庫中的MockObjectTestCase類。但我沒有嘗試過。

有一個「自動模擬」JUnit4運行器的請求,它將通過自動反射爲您創建上下文和模擬對象。有些人喜歡這樣,其他人真的不喜歡它。如果你想要這個功能,vote for the issue in the JMock JIRA

+0

呵呵hullo Nat,沒想到會在這裏找到你:)我修改了我的問題以包含建議的基類的來源。請注意,它完全是可選的,但確實讓生活更輕鬆一些。 – skaffman 2009-07-14 10:56:27

2

我也做過這個遷移,這是一個痛苦。我可以理解爲什麼他們已經對基類機制進行了分類 - 我試圖用支持Spring JUnit的基類來處理JMock基類,而這顯然不起作用。

一旦我開始這種遷移,我發現「優化」的一個領域是創建適當的Expectation基類,在您的模擬對象上封裝常用操作,而不是爲每個測試創建一個新的Expect對象(和實例)。這會爲你節省一點痛苦。

+0

認爲您評論過錯誤信息? – 2009-07-14 10:51:53