添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

powermock 常遇到的问题之一,

如果你需要mock一个静态方法,可能你会发现抛出如下异常

org.mockito.exceptions.misusing.MissingMethodInvocationException:

when() requires an argument which has to be 'a method call on a mock'.

For example:

when(mock.getArticles()).thenReturn(articles);

Also, this error might show up because:

1. you stub either of: final/private/equals()/hashCode() methods.

Those methods *cannot* be stubbed/verified.

Mocking methods declared on non-public parent classes is not supported.

2. inside when() you don't call method on mock but on some other object.

at org.powermock.api.mockito.PowerMockito.when(PowerMockito.java:495)

at schedule.PowerMockTest.test(PowerMockTest.java:18)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:497)

at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68)

at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:310)

at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:89)

at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:97)

at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:294)

at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:127)

at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82)

at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:282)

at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:87)

at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:50)

at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:207)

at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:146)

at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:120)

at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)

at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)

at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:122)

at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:106)

at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53)

at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59)

at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)

at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

这是我的示例:

import org.junit.Test;

import org.junit.runner.RunWith;

import org.powermock.api.mockito.PowerMockito;

import org.powermock.core.classloader.annotations.PrepareForTest;

import org.powermock.modules.junit4.PowerMockRunner;

import com.util.StaticClass;

@RunWith(PowerMockRunner.class)

@PrepareForTest({StaticClass.class})

public class PowerMockTest {

@Test

public void test(){

PowerMockito.mock(StaticClass.class);

PowerMockito.when(StaticClass.count()).thenReturn(-8);

出现以上问题的就是第二块红色部分,当你mock静态方法的时候,静态方法所在的类你需要换成

PowerMockito.mockStatic(StaticClass.class);

这样上面的这个异常就解决了,前提条件是得加上 @PrepareForTest({StaticClass.class}),如果没有 @PrepareForTest({StaticClass.class})也会出现上面这种异常

PowerMockito.mock 这个方法是mock一个对象出来的,我们经常需要调用private,final,构造函数这种的时候我们就用 PowerMockito.mock

解决方法: 1.用 powermock 中的api解决问题,在类中添加:@RunWith( PowerMock Runner.class) 2.如果是第二种情况,则需要重写返回对象的equals方法 把A a = new A(); PowerM... 文章目录 PowerMock ito.mockStatic(class) 模拟静态方法调用为什么要写单元测试引入依赖模拟工具类调用静态方法注解说明 PowerMock ito.mockStatic(class) 模拟静态方法调用 为什么要写单元测试 给我们重构的信心(give us the confidence to refactor)。一堆纠缠而无测试的代码你敢随便修改? 好的单元测试就是文档 (documenting expected behavior)。几个实用的例子比文档让人感兴趣的多! Mockito 模拟静态方法报错: org . mockito . exception s. mis using . Missing Method Invo cat ion Exception .求解 mockito 模拟静态方法报错: org . mockito . exception s. mis using . Missing Method Invo cat ion Exception .求解 我有一个简单的Java程序,该程序具有一个服务类,该服务类可检索以Euros-BitCoinValueService.java为单位的BitCoin当前价格. BitCoinPricer类采用BitCoinValueService类提供的数字并将其转换为美元.目标是从BitCoinValueService类模拟对象,因为该数字会频繁波动.这是测试类代码:@RunWith(JUnitParamsRu... org . mockito . exception s. mis using .InvalidUseOfMatchers Exception : Invalid use of argument matchers! 2 matchers expected, 1 recorded: -> at com.didi.bigdata.tag.control.DTagOuterControllerTest.lockDta... 这是因为我们在验证某些结果的时候,我们的对象使用被@InjectMocks注解了,此时并不是真实的Mock,此时我们可以在@InjectMocks上面加上一个@Spy注解就可以了,此时它就是一个真实的mock了。 所以我将一个小的Java代码库迁移到Kotlin只是为了好玩,我已经迁移了这个Java类:public class Inputs {private String engineURL;private Map parameters;public Inputs(String engineURL, Map parameters) {this.engineURL = engineURL;this.param... org . mockito . exception s. mis using .InvalidUseOfMatchers Exception : Mis placed or mis used argument matcher detected here: -> at xxxxxxxxxxxxxxxxxxxxxxxx You cannot use argument matchers outside of verifi cat ion or stubbing. Examples of correct usage of arg. 我有一个非常简单的测试用例,它使用 Mockito 和Spring测试框架.当我做when(pcUserService.read("1")).thenReturn(pcUser);我得到这个例外. org . mockito . exception s. mis using . Missing Method Invo cat ion Exception :when() requires an argument which has t... 首先给出测试方法的片段如下:MyAgent rpc = new MyAgent("myAgentName"); PowerMock ito.verifyPrivate(rpc). invo ke("initNode"); PowerMock ito.verifyPrivate(rpc). invo ke("initPowerSwitch", Mockito .anyString(), Mockito .anyIn...