当尝试在JUnit中使用PowerMock时,遇到了IllegalAccessError

首先

我在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>

进行分析

我尝试通过谷歌搜索找到了这条问答信息,对于我的问题有所参考。

stackoverflow – 初始化时Junit Mockito出现错误

根据这里的信息,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。

解决方法 fǎ)

将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>

这样就不会再出现错误了。

最后

有一个易于理解的问答,非常有帮助。

广告
将在 10 秒后关闭
bannerAds