56

我有一个使用 Mockito 和 Spring Test 框架的非常简单的测试用例。当我做

when(pcUserService.read("1")).thenReturn(pcUser);

我得到了这个例外。

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.
2. inside when() you don't call method on mock but on some other object.

    at com.project.cleaner.controller.test.PcUserControllerTest.shouldGetPcUser(PcUserControllerTest.java:93)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)

我尝试了不同的方法,但不断收到此错误消息。我正在使用带有 Mockito 的 Spring 3.1.0.RELEASE。请分享并指导我正确的方向。

4

12 回答 12

59

您需要先创建一个 pcUserService 的 MOCK,然后使用该模拟。

PcUserService mock = org.mockito.Mockito.mock(PcUserService.class);
when(mock.read("1")).thenReturn(pcUser);
于 2012-02-08T06:37:52.797 回答
29

万一其他人遇到这个问题......

也可能是您尝试模拟的方法pcUserService.read被声明为final方法。据我所知,这似乎会导致 Mockito 出现问题。

于 2016-10-04T10:32:37.620 回答
20

如果你使用Kotlin,你应该知道方法是final默认的。所以写open fun而不是fun. 感谢@djkelly99 的提示。

于 2018-03-27T08:18:51.580 回答
8

此问题的另一个解决方案可能是,如果测试类正在使用PowerMockRunner,您可能必须在@PrepareForTest注释中将要模拟的类添加到列表中。

例如 -

@PrepareForTest({ PcUserService.class })

于 2017-09-28T21:46:02.123 回答
4

在我的情况下,它是通过注入解决的@MockBean

例如。

@MockBean
StateRepository mockStateRepository;
于 2020-05-18T08:39:07.570 回答
3

这种错误还有另一个可能的原因 - 有时 IDE 更喜欢从另一个包中静态导入 Mockito.when() :

import static io.codearte.catchexception.shade.mockito.Mockito.when;

对比

import static org.mockito.Mockito.when; //should normally use this one

问题是 io.codearte 包中的“何时”在编译级别上与 org.mockito.Mockito.any() 兼容,但在运行时失败并显示完全相同的错误消息。

于 2018-01-10T10:49:53.000 回答
3

我有同样的问题,我试图模拟它的方法是最终方法。我删除了修改器,它工作正常。

于 2018-09-11T07:58:45.027 回答
2

为了帮助遇到同样问题的其他人;

您尝试模拟的方法 pcUserService.read 被声明为最终方法。静态方法似乎会导致 Mockito 出现问题。

于 2019-12-15T06:42:49.463 回答
1

基本上,您需要使用 PowerMockito.mockStatic 为类的所有静态方法启用静态模拟。这意味着可以使用 when-thenReturn 语法对它们进行存根。例如: PowerMockito.mockStatic(TestClass.class); when(TestClass.getString()).thenReturn("HelloWorld!"); 注意:您必须添加@PrepareForTest({ TestClass.class })到您的单元测试类。

于 2020-04-17T18:40:24.270 回答
1

如果在使用MockedStaticor时遇到此异常Mockito.mockStatic,也可能意味着您在调用静态方法时混合了匹配器和文字。

尝试改变任何混合YourClass.staticMethod(any(), "literal")喜欢YourClass.staticMethod(any(), eq("literal"))

于 2021-11-22T17:18:37.250 回答
0

如果您使用 KOIN,请在 gradle 的依赖项中包含:

dependencies {
    ...
    testImplementation "org.koin:koin-test:2.0.0"
}
于 2021-04-05T11:49:12.637 回答
0

在测试 someClass 的方法中调用另一个类的静态方法时,我遇到了类似的问题。在这种情况下,我们需要添加 @PrepareForTest({anotherClass.class, someClass.class}) 具有静态方法的类和调用者类。

于 2021-04-11T18:56:06.327 回答