首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PowerMockito.verifyStatic()问题

PowerMockito.verifyStatic()问题
EN

Stack Overflow用户
提问于 2015-10-06 18:17:16
回答 4查看 43K关注 0票数 13

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

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

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

试题班:

代码语言:javascript
复制
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();
    }
}

被测试的班级:

代码语言:javascript
复制
public class Test1 {
    public static void staticMethod() {
        System.out.println("Static Method!");
    }
}

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

EN

回答 4

Stack Overflow用户

发布于 2015-10-07 18:38:42

好吧,多亏了Stefan Birkner的参考文献

下面是对我的示例代码的更正:

代码语言:javascript
复制
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()调用之后再次调用它来验证是否调用了它。

代码语言:javascript
复制
        Test1.staticMethod();
        PowerMockito.verifyStatic();
        Test1.staticMethod();

你也可以检查它是否被这样多次调用.

代码语言:javascript
复制
Test1.staticMethod();
Test1.staticMethod();
Test1.staticMethod();
PowerMockito.verifyStatic(Mockito.times(3));
Test1.staticMethod();
票数 26
EN

Stack Overflow用户

发布于 2019-06-22 05:57:24

这本身并不是一个答案,而是一种确认奥利弗关于方法更改的评论在PowerMock 2.0.2和B上仍然有效的确认)--其中附有关于其工作方式的更多信息。

PowerMockito.verifyStatic()调用了Mockito.verify(),它在Javadoc上有几个示例:

代码语言:javascript
复制
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之后的行只是告诉它哪个调用计数器必须与第二个参数匹配:

代码语言:javascript
复制
PowerMockito.mockStatic(Test1.class);

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

// Validation
PowerMockito.verifyStatic(Test1.class, Mockito.times(3));
Test1.staticMethod();
票数 10
EN

Stack Overflow用户

发布于 2019-06-20 18:09:05

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

所以我从:

代码语言:javascript
复制
PowerMockito.verifyStatic(Mockito.times(1));

至:

代码语言:javascript
复制
PowerMockito.verifyStatic(Test1.class, Mockito.times(1));

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

代码语言:javascript
复制
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'
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32976855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档