JMockitを使ったテスト方法

Javaのテスト時のモックをJMockitを利用する方法を書きたいと思います。
Maven3とJDK7を利用しています。
まずは、Maven3の設定に関してです。

pom.xmljmockitの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.xmlsurefirejmockitへのパスを設定

なぜだかわからないが、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");
		}
	}
}