【问题标题】:Powermock mockstatic Cannot subclass final classPowermock mockstatic 不能子类化最终类
【发布时间】:2017-01-03 10:57:47
【问题描述】:

我正在尝试模拟最后一堂课

PowerMockito.mockStatic(TestFinalClass.class);

当我运行单个 junit 并将 javaagent 添加到我的 VM 参数时,它正在我的 Eclipse 中工作

-javaagent:{path}/powermock-module-javaagent-1.6.4.jar

但是当我尝试使用 maven build 命令从命令行运行所有测试用例时,我仍然收到“Cannot subclass final class”

下面是我的 pom.xml 中的 sn-p

            <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <argLine>-javaagent:{path}/powermock-module-javaagent-1.6.4.jar</argLine>
            </configuration>
        </plugin>

【问题讨论】:

    标签: java eclipse maven junit powermock


    【解决方案1】:
    package test;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.powermock.api.mockito.PowerMockito;
    import org.powermock.core.classloader.annotations.PrepareForTest;
    import org.powermock.modules.junit4.PowerMockRunner;
    
    @RunWith(PowerMockRunner.class)
    @PrepareForTest(FinalClass.class)
    public class Tests {
        @Test
        public void test() {
        PowerMockito.mockStatic(FinalClass.class);
        }
    }
    

    这对我有用。如果添加“PowerMockRunner”和“PrepareForTest”注释,则不需要使用额外的 vm 参数。

    【讨论】:

      【解决方案2】:
      import org.junit.Test;
      import org.junit.runner.RunWith;
      import org.powermock.api.mockito.PowerMockito;
      import org.powermock.core.classloader.annotations.PrepareForTest;
      import org.powermock.modules.junit4.PowerMockRunner;
      
      @RunWith(PowerMockRunner.class)
      @PrepareForTest(FinalClass.class)
      public class TestFinalClass{
      
          @Test
          public void whenMockFinalClassMockWorks() {
      
              FinalClass finalklass = PowerMockito.mock(FinalClass.class);
          }
      }
      

      【讨论】:

        【解决方案3】:

        我使用 JaCoCo 获得了代码覆盖率,需要在测试类代码中进行一些与之相关的更改。如下:

        1. 我删除了@RunWith 注释

        2. 添加了@Rule 和 PowerMockRule 类

        3. 在@PrepareForTest 中提到了Final 和Static 类

          @PrepareForTest(FinalClass.class, StaticClass.class)

          公共类测试{

          @Rule
          public PowerMockRule rule = new PowerMockRule();
          
          @Test
          public void test() {
              PowerMockito.mockStatic(FinalClass.class);
              PowerMockito.mockStatic(StaticClass.class);
          }
          

          }

        还在surefire中添加了argline以克服模拟时的最终类问题。

        <configuration>
                        <argLine>-javaagent:{path}/powermock-module-javaagent-1.6.4.jar</argLine>
                    </configuration>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-03-24
          • 2019-05-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多