Java開発環境(ユニットテスト編) - torutkのブログ で、Java開発環境(ユニットテスト編)として、ユニットテストで必須なモック作成のツールを紹介しました。このときは、staticメソッドを提供するクラスやfinalなクラスのモックが作成できないので、ツールを使ってモック作成を楽にするには、多少コーディング規約を緩めるしかないかと思っていました。上の日記では、JDaveというfinalを解除するツールを使ってfinalなクラスのモックを作るところまで記載していましたが、staticメソッドについては未解決のままでした。
その後、いくつかstaticメソッドを提供するクラスのモックを作るツールがあることを知ったので補足します。
PowerMock
前回紹介したEasyMockあるいはMockitoに、PowerMockを組み合わせると、finalなクラスのモック生成、staticメソッドを提供するクラスのモック生成が可能になります。
staticメソッドを提供するクラスのモック、finalなクラスのモック作成を可能にします。
Mockito+PowerMockの実行について
javassistを別途入手して実行時のクラスパスに追加する必要があります。
JMockit
名前が、JMockとMockitoの中間で、ちょっと紛らわしいのですが、JMockitはこれ単独でfinalクラスやstaticメソッドを提供するクラスのモックが作成できるツールです。
テスト対象クラスの中でnewして呼び出しているクラスがあると、モックと差し替えることが難しいのですが、JMockitでは、これすら差し替えることができるようです。
シングルトンやstaticなファクトリメソッド
ユニットテストをする観点でプログラムを見たときに、シングルトンを使ったり、staticなファクトリメソッドを使ってインスタンスを取得するという設計(どちらもコード上は同じくクラスのstaticメソッドを呼んでいますが)は、テスト容易性を阻害するというデメリットもあるのだと痛感しました。
テスト容易性を高めるために設計を改善するのがあるべき姿ですが、インスタンスを取得するのに、テスト容易性のためにDI(Dependency Injection)を導入するのもあまりに大掛かりすぎるし、他に有効な実装も見当たらず、ちょっと困っていました。
(Webアプリではないところでも、DIは有用なのですが、テスト容易性以外に必要性を強く訴える根拠がなくて・・・。)
そのような実情にあったテストツールが、PowerMocやJMockitです。
あとは、この両者、どっちを使ってみるか、使い勝手を比べてみよう。