- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在使用 powermockito (2.0.0-beta5) 验证静态方法在调用不同(也是静态)方法时被调用了一定次数时遇到问题。这些类已准备好在我的测试文件的顶部进行测试相关的代码片段是:
mockStatic(Tester.class);
when(Tester.staticMethod(anyString(), anyString())).thenAnswer(new FirstResponseWithText());
OtherClass.methodThatCallsTesterStaticMethod("", "", "", false, "");
verifyStatic(Tester.class, times(3));
Tester.sendFaqRequest(anyString(), anyString());
FirstResponseWithText
是一个扩展控制响应顺序的 Answer
的类。我在别处使用过它,效果很好。
我在 verifyStatic
行收到以下错误:
org.mockito.exceptions.misusing.NotAMockException:
Argument passed to verify() is of type Class and is not a mock!
Make sure you place the parenthesis correctly!
See the examples of correct verifications:
verify(mock).someMethod();
verify(mock, times(10)).someMethod();
verify(mock, atLeastOnce()).someMethod();
将类传递给 verifyStatic
的正确方法是什么?我可以在网上找到的所有示例都是针对 2.x.x 之前的版本,其中 verifyStatic
没有采用类参数。
最佳答案
我认为 PowerMockito 版本不是问题所在。我用版本测试了以下代码
应用类:
package de.scrum_master.stackoverflow.q52952222;
public class Tester {
public static String sendFaqRequest(String one, String two) {
return "real response";
}
}
package de.scrum_master.stackoverflow.q52952222;
public class OtherClass {
public static void methodThatCallsTesterStaticMethod(String one, String two, String three, boolean four, String five) {
System.out.println(Tester.sendFaqRequest("A", "B"));
System.out.println(Tester.sendFaqRequest("C", "D"));
System.out.println(Tester.sendFaqRequest("E", "F"));
}
}
测试类:
package de.scrum_master.stackoverflow.q52952222;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import java.util.Arrays;
public class FirstResponseWithText implements Answer {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
Object[] args = invocation.getArguments();
String methodName = invocation.getMethod().getName();
return methodName + " called with arguments: " + Arrays.toString(args);
}
}
package de.scrum_master.stackoverflow.q52952222;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.times;
import static org.powermock.api.mockito.PowerMockito.*;
@RunWith(PowerMockRunner.class)
@PrepareForTest({ Tester.class })
public class MyTest {
@Test
public void myTest() {
// Tell PowerMockito that we want to mock static methods in this class
mockStatic(Tester.class);
// Stub return value for static method call
when(Tester.sendFaqRequest(anyString(), anyString())).thenAnswer(new FirstResponseWithText());
// Call method which calls our static method 3x
OtherClass.methodThatCallsTesterStaticMethod("", "", "", false, "");
// Verify that Tester.sendFaqRequest was called 3x
verifyStatic(Tester.class, times(3));
Tester.sendFaqRequest(anyString(), anyString());
}
}
因此,如果这对您不起作用,并且您的 Maven 或 Gradle 依赖项也没有问题,那么区别可能在于您的 FirstResponseWithText
类。也许您想展示它,以便我们都能看到您在那里施展的魔法。正如您从我的示例代码中看到的那样,我不得不做出一些有根据的猜测,因为您只共享了一小段测试代码,而不是 MCVE。就像你应该的那样。这种方式我只能推测,实际上我不喜欢这样做,因为这可能对你和我自己都是浪费时间。
关于java - PowerMockito VerifyStatic 在 2.0.0-beta5 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52952222/
我只想模拟类中的一个静态方法,所有其他方法都应该像真实对象一样工作。 代码: public class ArrTest { public static int myMethod (int ar
我在使用 PowerMockito 模拟 whenNew(File.class) 时遇到问题。这是我要测试的方法: public void foo() { File tmpFile = new
我正在尝试模拟静态方法 Thread.sleep(1);在调用时返回 InterruptedException。我发现了一个似乎解决了我的问题的 SO 问题,但是在将我的代码设置为与该问题的答案相同后
我似乎无法克服这个问题。我正在尝试模拟一个带有 1 个参数的重载方法 class ClassWithOverloadedMethod { private boolean isValid(Cla
考虑以下(简化的)枚举: MyEnum { ONE public int myMethod() { // Some complex stuff return 1
当我尝试使用字符串输入模拟静态方法时,当我给出特定字符串时,模拟 stub 就会被执行,但是当我使用anyString()时,它不会按预期工作。 public class Foo { publ
我在一些单元测试中使用 PowerMockito,但遇到了问题。我正在尝试测试一种创建一系列线程并运行它们的方法。在每个线程内,创建一个我需要期望的对象,并返回我自己的模拟对象(它发出 http 请求
我有以下类,在构造函数中,我调用另一个构造函数来构建该类的字段: public class ClassIWantToTest { private ClassIWantToMock anothe
您好,我有这个 PowerMockito 测试,它会抛出 UnfinishedStubbingException @RunWith(PowerMockRunner.class) @PrepareFor
我有一些静态方法可以使用 Mockito + PowerMock 进行模拟。一切都是正确的,直到我尝试模拟一个只抛出异常的静态方法(并且什么都不做)。 我的测试类是这样的: 顶部: @RunWith(
测试片段: void somefunction() { try { aMock.doSomething(); bMock.another(); } finally {
我正在尝试使用 PowerMockito 捕获输入中传递给模拟对象的参数,这是代码: //I create a mock object ClassMocked mock = PowerMockito.
要测试的类 public class Randomer { public int get() { return (int) Math.random() + 1; } }
我正在编写 JUnit 测试以验证静态方法 (MyClass.myMethod()) 从未在方法流中被调用。我试着做这样的事情: PowerMockito.verifyStatic(Mockito
我想检查是否使用一组特定的参数调用了特定的构造函数,并检查参数是否正确。 该类使用 java (...) 的任意参数,如下所示: public class MyClass{ public My
我正在测试一个运行直到AtomicBoolean值发生变化的任务类。我使用 PowerMockito 是因为 AtomicBoolean 实例的 get() 方法是 final方法。 MyTaskTe
我有以下 jar : javax.servlet-api-3.1.9.jar junit-4.10.jar mockito-all-1.10.19.jar mockito-core-1.10.19.j
在单元测试中,如何忽略对方法的调用,如下所示? void methodToBeTested(){ // do some stuff methodToBeSkipped(parame
我正在尝试测试一些严重依赖静态方法调用的遗留代码。 基本上,我有一个类 A,它有方法 b() 和 c()。 A.b() 返回 void,A.c() 返回一个值。 如果真正的 A.b() 被调用,被测类
我正在使用 PowerMockito 测试静态方法,但不幸的是得到了ClassCastException。注意完全确定我是否没有遵循语法规则。 待测试代码: List proxyPrefs = (Li
我是一名优秀的程序员,十分优秀!