easymockを利用してみる(1) – Virtual Mock Object と Mock Object の違い
以前Mock Objectに少し触れたことがあるが、私自身使用したことが無かったので今回試してみた。
また、Virtual Mock Object として、dJUnitを利用したことがあるので、これとの比較も書いてみたいと思う(したがって、タイトルのVirtual Mock Objectは、正確にはdJUnitを指すものであって、Virtual Mock Object全体の性質であるとは限らない)。
テストカバレッジについて日本語のサイトを検索すると、dJUnitがよくヒットする。また、Eclipseプラグインとしても提供されており、導入難易度が低いせいか実プロジェクトでもよく利用されているようだが、実際に利用してみて何点か不満が出た。例を以下に記載する。
- カバレッジについて、かなり古いバージョンのJCoverageを利用している。
- 現在オープンソース版のCloverが提供されなくなって久しいが、dJUnitでは当時のGPL版のものを用いているはず。
- Eclipse以外から利用するのに、設定が煩雑である。特にVirtual Mock Objectを利用する場合。
- Eclipse上で使用する場合は、Eclipse設定画面で設定できるのだが。
- Antで実行する場合、専用のタスク(junitタスクに似てはいるが)で実行する必要がある。
- テスト対象の規模が大きくなると、実用に耐えられないくらい遅い。
- 1テストケースごとに、クラスロードに数分、というようなことも。
- forkは常にtrueなので、テストケースごとにVMが分かれる。
- 仕様なのかバグなのか不明だが、テストケースをロードした直後(具体的には@BeforeClassアノテーションを付けたメソッド内)にしかVMO動作設定できない現象が出たので、テストを細分化してVM起動からやり直す必要が出た。
- 1テストケースごとに、クラスロードに数分、というようなことも。
- dJUnit、Hibernate共にasm(cglib)を利用するのだが、必要とされるバージョンが異なるのではまる。
- これについては、Hibernateが古いバージョンを利用しているのが問題なのだが。
- easymockやjMockでもcglibを利用しているようなので、この問題はdJUnitに限ったことではないのかもしれない。
Mock Objectはオブジェクトに対して動作を設定するのに対し、Virtual Mock Objectはクラス自体の動作を書き換えるらしい。このためVirtual Mock Objectは動作速度が遅くなりがちなのではないかと思う。また、Mock Objectではこの問題が表れにくいのではないかと期待しているが、冒頭に記載したとおりMock Objectの使用経験が無いため実際のところは未知である。
JCoverageの問題については、Coberturaを利用すればよいだろう。
« [読書]「科学研究者になる方法」上田寿 | トップページ | easymockを利用してみる(2) – easymockのインストールとHelloWorld »
この記事へのコメントは終了しました。
« [読書]「科学研究者になる方法」上田寿 | トップページ | easymockを利用してみる(2) – easymockのインストールとHelloWorld »
コメント