我正在尝试使用PowerMockito
模拟静态方法。我已经提到了各种stackoverflow答案,例如:Mocking static methods with PowerMock and Mockito
但我得到:org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
Misplaced argument matcher detected here
例外。
我花了几个小时调试我的代码和谷歌搜索但无济于事。我在这里缺少什么?
*注意:我将其作为testng测试运行。 *
我在代码中添加了一些注释,可以帮助您了解我要做的事情。
完整堆栈跟踪是:
org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
Misplaced argument matcher detected here:
at MyClassTest.testMethod1(MyClassTest.java:24)`
You cannot use argument matchers outside of verification or stubbing.
Examples of correct usage of argument matchers:
when(mock.get(anyInt())).thenReturn(null);
doThrow(new RuntimeException()).when(mock).someVoidMethod(anyObject());
verify(mock).someMethod(contains("foo")) `
Also, this error might show up because you use argument matchers with methods that cannot be mocked.
Following methods *cannot* be stubbed/verified: final/private/equals()/hashCode().
Mocking methods declared on non-public parent classes is not supported.`
at MyClassTest.testMethod1(MyClassTest.java:24)
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:498)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:714)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
at org.testng.TestRunner.privateRun(TestRunner.java:767)
at org.testng.TestRunner.run(TestRunner.java:617)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:348)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:343)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:305)
at org.testng.SuiteRunner.run(SuiteRunner.java:254)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1149)
at org.testng.TestNG.run(TestNG.java:1057)
at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:132)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:230)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:76)
`
以下是我的代码:
测试类
import static org.mockito.Matchers.anyString;
import org.junit.runner.RunWith;
import org.mockito.BDDMockito;
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.testng.annotations.Test;
@Test
@RunWith(PowerMockRunner.class)
@PrepareForTest(AnotherClass.class)
public class MyClassTest {
MyClass myClass;
@Test
public void testMethod1() {
/*
* Mock static methods
*/
PowerMockito.mockStatic(AnotherClass.class);
BDDMockito.given(AnotherClass.yetAnotherMethod(anyString())).willReturn(Mockito.mock(String.class));
// call the method of system under test
myClass.method1();
// verify
PowerMockito.verifyStatic();
}
}
受测系统:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
public class MyClass {
public String method1() {
String result = AnotherClass.yetAnotherMethod("Pramithas");
return result;
}
}
AnotherClass.java
:
import org.springframework.stereotype.Service;
public class AnotherClass {
public static String yetAnotherMethod(String s) {
return s;
}
}
答案 0 :(得分:1)
MyClass
删除了@Test
注释
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.mockito.Matchers.anyString;
import org.mockito.BDDMockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest(AnotherClass.class)
public class MyClassTest {`
MyClass myClass = new MyClass();
@Test
public void testMethod1() {
/*
* Mock static methods
*/
PowerMockito.mockStatic(AnotherClass.class);
BDDMockito.given(AnotherClass.yetAnotherMethod(anyString())).willReturn("any String");
// call the method of system under test
myClass.method1();
// verify
PowerMockito.verifyStatic();
}
}
这已经过验证。它应该工作。
答案 1 :(得分:0)
我让你的例子进行了一些改动:
@RunWith(PowerMockRunner.class)
@PrepareForTest({ AnotherClass.class })
public class MyClassTest {
@Before
public void setUp() {
myClass = new MyClass();
}
@Test
public void testMethod1() {
/*
* Mock static methods
*/
PowerMockito.mockStatic(AnotherClass.class);
BDDMockito.given(AnotherClass.yetAnotherMethod(Mockito.anyString())).willReturn("Hello");
// call the method of system under test
String a = myClass.method1();
// verify
PowerMockito.verifyStatic();
}
我已将AnotherClass
添加到PrepareForTest
并强制AnotherClass
模拟返回String
值,因为Mockito无法模拟最终类,我可以检查myClass
1}}按预期行事。这是我的Mockito和Powermock依赖项:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>2.7.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.7.0RC2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito2</artifactId>
<version>1.7.0RC2</version>
<scope>test</scope>
</dependency>