我有一个非常简单的测试用例,它使用的是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。请分享并指导我正确的方向。
答案 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}) 具有静态方法的类和调用者类。