JMockitを使ったテスト方法
Javaのテスト時のモックをJMockitを利用する方法を書きたいと思います。
Maven3とJDK7を利用しています。
まずは、Maven3の設定に関してです。
pom.xmlにjmockitのdependency
...... <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <junit.version>4.11</junit.version> <jmockit.version>0.999.4</jmockit.version> </properties> <dependencies> <dependency> <groupId>mockit</groupId> <artifactId>jmockit</artifactId> <version>${jmockit.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies> ......
pom.xmlのsurefireにjmockitへのパスを設定
なぜだかわからないが、jmockitのjarファイルにパスを通しておかないとMacだと動かなかった。
Windows7は、設定しなくとも動作してました。
自分は、Macなので、下記の設定もしました。
...... <build> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.15</version> </plugin> </plugins> </pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <argLine>-javaagent:${HOME}/.m2/repository/mockit/jmockit/0.999.4/jmockit-0.999.4.jar</argLine> </configuration> </plugin> </plugins> </build>
テストクラスを作成し、Systemクラスのモック定義を追加
Junit4を使ったテストクラスを作成して、Systemクラスのモッククラスを作ります。
@MockClassにモックにしたいクラスを指定して、@Mockでモックにするメソッドを指定します。
下記は、System.currentTimeMillis()をモックにしています。
public class TestSystem { @MockClass(realClass = System.class) public static class MockSystem { @Mock public static long currentTimeMillis() { return new Long("1378446075311"); } } }
テストメソッドを追加
モッククラスが定義出来たら、テストメッソドを書きます。
最初にMockit.setUpMock(MockSystem.class)を記載すると、Systemクラスがモックに入れ替わります。
public class TestSystem { @Test public void test() throws Exception { // システムクラスモックを設定 Mockit.setUpMock(MockSystem.class); Timestamp timestap = new Timestamp(System.currentTimeMillis()); assertEquals(timestap.toString(), "2013-09-06 14:41:15.311"); } @MockClass(realClass = System.class) public static class MockSystem { @Mock public static long currentTimeMillis() { return new Long("1378446075311"); } } }