Mockito Exception - when()需要一个必须是模拟方法调用的参数

时间:2012-02-08 01:24:09

标签: java controller mockito spring-test

我有一个非常简单的测试用例,它使用的是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)

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

11 个答案:

答案 0 :(得分:35)

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

PcUserService mock = org.mockito.Mockito.mock(PcUserService.class);
when(mock.read("1")).thenReturn(pcUser);

答案 1 :(得分:19)

如果其他人遇到这个问题......

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

答案 2 :(得分:6)

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

答案 3 :(得分:2)

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

例如 -

@PrepareForTest({ PcUserService.class })

答案 4 :(得分:2)

我遇到了同样的问题,我尝试模拟的方法是最终方法。我删除了修改器,效果很好。

答案 5 :(得分:2)

就我而言,它是通过注入@MockBean来解决的。

例如。

@MockBean
StateRepository mockStateRepository;

答案 6 :(得分:0)

出现此类错误的另一个可能原因 - 有时IDE更喜欢从另一个软件包中静态导入Mockito.when():

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

VS

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

事情是&#39;当&#39;来自io.codearte的软件包在编译级别上与org.mockito.Mockito.any()兼容,但在运行时期间因完全相同的错误消息而失败。

答案 7 :(得分:0)

为其他遇到相同问题的人提供帮助;

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

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

dependencies {
    ...
    testImplementation "org.koin:koin-test:2.0.0"
}

答案 10 :(得分:0)

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