12

我需要使用 PowerMockito 来测试是否调用了特定的静态方法。我正在使用以下 PowerMockito 和 JUnit 库...

  • powermock-mockito-1.6.2-full.jar
  • junit-4.12.jar

我在让 PowerMockito.verifyStatic() 方法正常工作时遇到问题。在下面的代码示例中,我尝试使用 @PrepareForTest 和 mockStatic(),并尝试排除它们。在代码示例中,我包含了它们。

测试类:

import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(PowerMockRunner.class)
@PrepareForTest(Test1.class)
public class PowerMockTest {
    @Test
    public void staticVerifyTest() {
        PowerMockito.mockStatic(Test1.class);

        // Test
        PowerMockito.verifyStatic();
        //Test1.staticMethod();
    }
}

被测类:

public class Test1 {
    public static void staticMethod() {
        System.out.println("Static Method!");
    }
}

测试在运行时通过,但它应该失败,因为从未调用过 Test1.staticMethod()。对此的任何帮助将不胜感激!

4

4 回答 4

25

好的,感谢 Stefan Birkner 的参考,我明白了

这是对我的示例代码的更正:

import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(PowerMockRunner.class)
@PrepareForTest(Test1.class)
public class PowerMockTest {
    @Test
    public void staticVerifyTest() {
        PowerMockito.mockStatic(Test1.class);
        // Test
        Test1.staticMethod();
        PowerMockito.verifyStatic();
        Test1.staticMethod();
    }
}

调用静态方法后,您需要在调用 verifyStatic() 之后再次调用它来验证它是否被调用。

IE

        Test1.staticMethod();
        PowerMockito.verifyStatic();
        Test1.staticMethod();

您还可以检查它是否像这样被多次调用...

Test1.staticMethod();
Test1.staticMethod();
Test1.staticMethod();
PowerMockito.verifyStatic(Mockito.times(3));
Test1.staticMethod();
于 2015-10-07T18:38:42.550 回答
10

它本身不是一个答案,而是 A) 确认 Oliver 关于方法更改的评论在 PowerMock 2.0.2 中仍然有效,B) 附有关于其工作原理的附加信息的说明。

PowerMockito.verifyStatic()调用Mockito.verify()在其 Javadoc 中有一些示例:

verify(mock, times(5)).someMethod("was called five times");
verify(mock, atLeast(2)).someMethod("was called at least two times");

由于这个 sintax 不再可用,我们需要 2 行代码来声明验证规则。使用 John 的示例,这意味着前 3 行将是“实际”业务调用,而verifyStatic之后的行只是告诉它哪个调用计数器必须匹配第二个参数:

PowerMockito.mockStatic(Test1.class);

// Test
Test1.staticMethod();
Test1.staticMethod();
Test1.staticMethod();

// Validation
PowerMockito.verifyStatic(Test1.class, Mockito.times(3));
Test1.staticMethod();
于 2019-06-22T05:57:24.673 回答
6

2.0.0-beta.5对我来说,我在升级到 powermock时遇到了这个问题1.7.0,所以上面发布的这些解决方案并没有帮助解决我的问题。相反,我必须在 powermock 文档中发布的 verify 静态调用中添加模拟类(https://static.javadoc.io/org.powermock/powermock-api-mockito/1.7.1/deprecated-list .html )

所以我从:

PowerMockito.verifyStatic(Mockito.times(1));

至:

PowerMockito.verifyStatic(Test1.class, Mockito.times(1));

这解决了我在使用以下库时的问题:

testCompile group: 'org.mockito', name: 'mockito-core', version: '2.18.0'
testCompile group: 'org.powermock', name: 'powermock-api-mockito2', version: '2.0.0-beta.5'
testCompile group: 'org.powermock', name: 'powermock-module-junit4', version: '2.0.0-beta.5'
于 2019-06-20T18:09:05.143 回答
1

使用版本 2.0.7powermock-api-mockito2powermock-module-junit4Mockito 2.28.2 或 3.3.3,通过如下定义的测试,我不断收到有关“TooManyActualInvocations:想要 1 次但被 2 次”的错误。

public class StaticClass {
  // Note: void method with arguments
  public static void doSomething(final String arg) {
    doSomethingElseWithArg(arg);
  }
}

public class ClassUnderTest {
  public void doWork(String arg) {
    StaticClass.doSomething(arg);
  } 
}

@RunWith(PowerMockRunner.class)
@PrepareForTest(StaticClass.class)
public class MyTest {
  ClassUnderTest tester = new ClassUnderTest();

  @Test 
  public void myStaticTest() throws Exception {
    PowerMockito.mockStatic(StaticClass.class);
    StaticClass.doSomething("hello");  // won't work

    tester.doWork("hello");

    PowerMockito.verifyStatic(StaticClass.class);
    StaticClass.doSomething("hello"); // TooManyActualInvocations 
  }
}

在仔细检查原始代码没有调用该方法两次、大量文档阅读和许多兔子踪迹之后,我终于让它工作了。测试方法需要看起来像这样:

@Test 
public void myStaticTest() throws Exception {
  PowerMockito.mockStatic(StaticClass.class);
  PowerMockito.doNothing().when(StaticClass.class, "doSomething", "hello"); 

  tester.doWork("hello");

  PowerMockito.verifyStatic(StaticClass.class);
  // specify the method and the args expected in the call
  StaticClass.doSomething("hello");
}

我花了很长时间才弄清楚我正在为下一个人记录。

于 2020-07-08T00:02:50.570 回答