2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

JUnitでPowerMock使おうとしたらIllegalAccessErrorになった

Last updated at Posted at 2018-09-08

はじめに

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.RELEASEMockito 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があって助かりました。

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?