PowerMockito.verifyStatic()问题

Joh*_*lls 8 java junit powermockito

我需要使用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();
    }
}
Run Code Online (Sandbox Code Playgroud)

被测试类:

public class Test1 {
    public static void staticMethod() {
        System.out.println("Static Method!");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*lls 18

好吧,我想通过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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

        Test1.staticMethod();
        PowerMockito.verifyStatic();
        Test1.staticMethod();
Run Code Online (Sandbox Code Playgroud)

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

Test1.staticMethod();
Test1.staticMethod();
Test1.staticMethod();
PowerMockito.verifyStatic(Mockito.times(3));
Test1.staticMethod();
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的帮助。是我还是api智障者? (2认同)

小智 7

这本身不是答案,而是 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");
Run Code Online (Sandbox Code Playgroud)

由于此语法不再可用,我们需要 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();
Run Code Online (Sandbox Code Playgroud)


小智 5

对于我来说,我遇到了这个问题,当升级到powermock2.0.0-beta.51.7.0等这些解决方案上面贴没有帮助解决我的问题。相反,我必须在 powermock 文档中发布的验证静态调用中添加模拟类(https://static.javadoc.io/org.powermock/powermock-api-mockito/1.7.1/deprecated-list .html )

所以我从:

PowerMockito.verifyStatic(Mockito.times(1));
Run Code Online (Sandbox Code Playgroud)

到:

PowerMockito.verifyStatic(Test1.class, Mockito.times(1));
Run Code Online (Sandbox Code Playgroud)

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

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'
Run Code Online (Sandbox Code Playgroud)