はじめに
JUnitのテストで、PowerMockを使いたくて導入しようとしてみたんですが、エラーが発生したので、その解決法をまとめます。
症状
// Fooのテスト
public class FooTest {
@Test
public void testFoo() {
// Mockを作成
Bar bar = mock(Bar.class);
// いろいろなテスト
}
}
PowerMock導入前にこんな感じのテストコードを書いており、正常に動作していました。
pom.xmlにPowerMockを追加してみたところ、テスト実行時に以下のエラーが発生するようになりました。
java.lang.IllegalAccessError: class org.mockito.internal.creation.jmock.ClassImposterizer$1 cannot access its superclass org.mockito.internal.creation.cglib.MockitoNamingPolicy
pom.xmlの内、関係ありそうなところはこんな感じです。
<dependencies>
<!-- Spring Boot Starter Test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Powermock -->
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.5.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.5.4</version>
<scope>test</scope>
</dependency>
<!-- その他外部ライブラリ -->
</dependencies>
分析
ググってみたところ、こちらのQ&Aが参考になりました。
stackoverflow - Junit Mockito error on initialization
こちらによると、spring-boot-starter-test 1.4.2.RELEASE
はMockito 1.10.19
をデフォルトで利用しており、1.10.19にはorg.mockito.internal.creation.jmock.ClassImposterizer
が入っていないそうです。
私の環境では、spring-boot-starter-test 1.5.14.RELEASE
を使っておりまして、Mavenの依存関係を確認したところ、こちらもMockito 1.10.19
を利用していることがわかりました。
1.9.5にはorg.mockito.internal.creation.jmock.ClassImposterizer
が入っているそうです。
解決法
pom.xmlを以下のように変更します。
<dependencies>
<!-- Spring Boot Starter Test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<!-- Mockitoを除外 -->
<exclusions>
<exclusion>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Mockitoを追加 -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>1.9.5</version>
<scope>test</scope>
</dependency>
<!-- Powermock -->
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.5.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.5.4</version>
<scope>test</scope>
</dependency>
<!-- その他外部ライブラリ -->
</dependencies>
これで、エラーが発生しなくなりました。
さいごに
わかりやすいQ&Aがあって助かりました。