ユニットテストのコードベースをついに JUnit 3 から JUnit 4 に移行しました。JMock 2 も多用しています。
JUnit 3 では、JMock はテスト用の便利な基本クラス (MockObjectTestCase) を提供します。これは、それ自体が Junit の TestCase のサブクラスであるだけでなく、モック フレームワークに関するさまざまなハウスキーピング タスクを処理します。これにより、テスト クラスの作業がかなり楽になります。
現在、JUnit4 では、JMock はそのようなサポートを提供していません。テスト クラスは、Mockery オブジェクトを手動で作成する必要があり、正しいテスト ランナー アノテーションを使用することを覚えておく必要があり、すべてのモック関連の操作をモックに委譲する必要があります。つまり、JUnit 3 テストで必要とされていたよりもはるかに多くの責任がテスト クラスに課せられます。
JUnit4 の魅力の 1 つは何かをサブクラス化する必要がないことですが、この 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 アノテーションもあります。