JMockitを使用した単体テスト1
JMockitは、finalなクラス/メソッド、staticメソッド、コンストラクタ等のテストをできるライブラリです。メソッドの中で生成されるインスタンスもモックにすることができます。おまけに、カバレッジも計測することもできます。
動作環境
JMockitは、JavaSE 5で導入されたInstrumentationを使用していますので、JavaSE 5以上が必要です。JUnitやTestNGと併せて使用します。JUnitは3.8や4.Xにも対応していますが、極力4.5以上を使用した方が楽です。
4つのAPI
- Core API
- 小さなクラスで、動作時にクラスをモックと差し替えます。容易なAPIですが複雑なテストクラスを記述するには十分ではないため、今ではレガシーなAPIです。
- Annotations API
- Core APIと似ていますが、差し替えるモックをアノテーションで指定します。
- Expectations API
- 上記のAPI群と違って、record-replayモデルに基づいています。EasyMock等と同様に、期待される動作を記述します。より簡潔にテストを記述できます。
- Verifications API
- Expectations APIの拡張で、record-replay-verifyモデルに基づいています。
Core APIやAnnotations APIはシンプルですが、実クラスと差し替えるモックを記述しないといけないため、他のモックライブラリより記述量が増えてしまいます。ここでは、Expectations APIを使用します。
準備
いくつかの方法がありますが、Hudson等のCIツールで使いやすい方法は2通りあります。
-javaagentオプションを使用する
テスト起動時に-javaagent:jmockit.jarを指定します。Mavenを使用している場合は、pom.xmlに以下のように記述します。*1
<properties> <jmockit.version>0.993</jmockit.version> </properties> <build> <plugins> : <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <argLine> -javaagent:"${settings.localRepository}"/mockit/jmockit/${jmockit.version}/jmockit-${jmockit.version}.jar </argLine> </configuration> </plugin> : </plugins> </build>
テストクラスに@RunWith(JMockit.class)を付与する
JUnit 4.5以上限定ですが、テストクラスに@RunWith(Jmockit.class)を付与します。-javaagentを使用した場合は不要です。
@RunWith(JMockit.class) public class FortuneTellerTest {
それ以外の方法については、Running tests with JMockitを参照してください。