Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java PowerMockito.verifyStatic()问题_Java_Junit_Powermockito - Fatal编程技术网

Java PowerMockito.verifyStatic()问题

Java PowerMockito.verifyStatic()问题,java,junit,powermockito,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.m

我需要使用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()。在此方面的任何帮助都将不胜感激

好吧,多亏了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()调用后再次调用该方法,以验证是否调用了该方法

i、 e

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

Test1.staticMethod();
Test1.staticMethod();
Test1.staticMethod();
PowerMockito.verifyStatic(Mockito.times(3));
Test1.staticMethod();

对我来说,我在从
1.7.0
升级到powermock
2.0.0-beta.5
时遇到了这个问题,因此上面发布的这些解决方案不能帮助解决我的问题。相反,我必须在powermock()文档中发布的verify静态调用中添加mock类

所以我从:

PowerMockito.verifyStatic(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'

这本身不是一个答案,而是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不再可用,我们需要两行代码来声明验证规则。以John为例,这意味着前3行是“实际”业务呼叫,verifyStatic之后的那一行只是告诉它哪个呼叫计数器必须与第2个参数匹配:

PowerMockito.mockStatic(Test1.class);

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

// Validation
PowerMockito.verifyStatic(Test1.class, Mockito.times(3));
Test1.staticMethod();

使用
powermock-api-mockito2
powermock-module-junit4
version 2.0.7和Mockito 2.28.2或3.3.3,使用如下定义的测试,我不断得到一个关于“ToomanyActualInvestions:想要1次,但是2次”的错误

在反复检查原始代码没有两次调用该方法、大量的文档读取和大量的兔子追踪之后,我终于让它工作了。测试方法需要如下所示:

@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");
}

我花了很长时间才弄明白这一点,我正在为下一个人编写文档。

您不应该使用PowerMockito来测试您的静态方法,因为这个方法没有嵌入到另一个类中。模拟用于绕过一些实际调用。如果只想测试Test1类,请直接调用staticMethod()并为要测试的行为添加断言(没有断言的测试不是测试)。是的,我知道这不是一个好的测试。我只是好奇verifyStatic()方法是如何工作的。它应该用于我上面的例子吗?谢谢。如果类a包含一些来自类B的静态方法,您可以使用PowerMockito来模拟这些静态调用并测试类a的行为。这里有一个完整的示例:。PowerMockito应该谨慎使用:)天啊,我希望这里的文档更清楚:我浪费了太多时间试图理解为什么这不起作用!谢谢你的帮助。是我还是api有问题?没问题!我很高兴这有帮助。是的,API绝对不是直截了当的。我学会了避免使用它,坚持使用Mockito并重新设计代码以使其更易于测试。你发布的参考链接不再有效。我很好奇为什么即使没有调用该方法,测试也会通过?我只是使用最新的powermock版本()对其进行了测试,并验证了如果您对第一个静态方法调用Test1.staticMethod()进行注释,测试将失败。请注意,PowerMockito.verifyStatic()在最新版本中已被弃用,因此请使用PowerMockito.verifyStatic(类mockedClass)。
PowerMockito.mockStatic(Test1.class);

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

// Validation
PowerMockito.verifyStatic(Test1.class, Mockito.times(3));
Test1.staticMethod();
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");
}