JMockitを使用した単体テスト1

JMockitは、finalなクラス/メソッド、staticメソッド、コンストラクタ等のテストをできるライブラリです。メソッドの中で生成されるインスタンスもモックにすることができます。おまけに、カバレッジも計測することもできます。

動作環境

JMockitは、JavaSE 5で導入されたInstrumentationを使用していますので、JavaSE 5以上が必要です。JUnitTestNGと併せて使用します。JUnitは3.8や4.Xにも対応していますが、極力4.5以上を使用した方が楽です。

4つのAPI

JMockitには、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を参照してください。

*1:NetBeans 6.7.1ではCtrl-F6による特定のテストクラスの実行ができませんでした(Alt-F6ではOK)。開発版の6.8では問題なく動きます。