java - Mockito.any(class) 生成无效使用匹配器异常

标签 java mockito powermock

我正在尝试使用如下代码来 stub 具有预期返回对象的服务方法:

@RunWith(PowerMockRunner.class)
@PrepareForTest(XYZUtil.class)
class SUT {

   @InjectMocks
   XYZController xyzController;

   @Mock
   XYZService xyzService;

   @Test
   public void testDoSomethingController(){

    PowerMockito.mockStatic(XYZUtil.class);

    XYZ xyz = Mockito.mock(XYZ.class);
    PowerMockito.when(XYZUtil.doSomething(Mockito.any(java.sql.Date.class))).thenReturn(xyz); //facing error here
    //other logic testing
   }
}

所以我基本上在我评论的那一行面临着 InvalidUseOfMatchersException 。 XYZUtil 有一个我试图模拟的静态函数。

这是堆栈跟踪:

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Misplaced argument matcher detected here:
-> at com.myproject.web.rest.api.test.controller.XYZControllerTest.testdoSomethingController_Success(XYZControllerTest.java:708)

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().

    at com.myproject.web.rest.api.test.controller.XYZControllerTest.testdoSomethingController_Success(XYZControllerTest.java:708)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:66)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:312)
    at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:86)
    at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:94)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:296)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:112)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.access$100(PowerMockJUnit47RunnerDelegateImpl.java:59)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner$LastRuleTestExecutorStatement.evaluate(PowerMockJUnit47RunnerDelegateImpl.java:133)
    at org.junit.rules.ExpectedException$ExpectedExceptionStatement.evaluate(ExpectedException.java:110)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:83)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:284)
    at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:84)
    at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:209)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:148)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:122)
    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:120)
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:102)
    at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53)
    at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:42)
    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:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

最佳答案

我以前见过这样的事情,

我们倾向于使用其他调用来使其工作

when(myclass.mymethod(anyString())).thenReturn(outputObject);

所以我们使用

任何字符串

任意长

任意对象

等等...

因为这样就不需要施放该元素了。

我们发现的另一件事是,有时您可能会意外导入错误版本的 any()

确保它是 Mockito 而不是 Hamcrest 或其他类似的。

关于java - Mockito.any(class) 生成无效使用匹配器异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24301613/

相关文章:

java - 在 JUnit 测试中模拟日期格式 (SimpleDateFormat)

java - 如何使用 Mockito 注释注入(inject) @Value 构造函数参数

spring-boot - java.lang.NoSuchMethodError : org. mockito.MockingDetails.getMockCreationSettings()Lorg/mockito/mock/MockCreationSettings

java - Powermock 或 EasyMock junits

Java 8 Nashorn JJS – javascript 控制台

java - 在 Eclipse 中调试 Web 应用程序

java - 如何使用Jdom包?

java - 如何将 Xtend 模板与 C hello World 一起使用?

java - 模拟假定存在的私有(private)变量

Powermock 不会为 java.time.ZonedDateTime 创建模拟