我們終於從遷移的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註解也在那裏,以避免忘記將其添加到測試類中的可能性。
我同意構圖的靈活性非常高,但是繼承帶來了方便。能夠挑選是很好的。 – skaffman 2009-09-05 21:06:18