unit-testing - 当看起来没问题时,Mockito 会给出 UnfinishedVerificationException

标签 unit-testing junit mockito junit5

当我认为我已经正确完成所有操作时,Mockito 似乎会抛出 UnfinishedVerificationException 。这是我的部分测试用例:

HttpServletRequest req = mock(HttpServletRequest.class);
when(req.getHeader("Authorization")).thenReturn("foo");

HttpServletResponse res = mock(HttpServletResponse.class);

classUnderTest.doMethod(req, res); // Use the mock

verify(res, never());
verify(req).setAttribute(anyString(), anyObject());

这是部分类和方法:

class ClassUnderTest extends AnotherClass {
    @Override
    public String doMethod(ServletRequest req, ServletRequest res) {
        // etc.
        return "someString";
    }
}

忽略你不应该模拟不属于你的接口(interface)这一事实,为什么 Mockito 给我以下消息?

org.mockito.exceptions.misusing.UnfinishedVerificationException: 
Missing method call for verify(mock) here:
-> at (redacted)

Example of correct verification:
    verify(mock).doSomething()

Also, this error might show up because you verify either of: final/private/equals()/hashCode() methods.
Those methods *cannot* be stubbed/verified.

at [test method name and class redacted]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.run(JUnit45AndHigherRunnerImpl.java:37)
at org.mockito.runners.MockitoJUnitRunner.run(MockitoJUnitRunner.java:62)
at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
... etc

最佳答案

如果您尝试验证一个需要使用any()原始参数的方法,也可能会导致这种情况:

例如,如果我们的方法具有以下签名:

method(long l, String s);

并且您尝试像这样验证它,它将失败并显示上述消息:

verify(service).method(any(), anyString());

将其更改为anyLong(),它将起作用:

verify(service).method(anyLong(), anyString());

关于unit-testing - 当看起来没问题时,Mockito 会给出 UnfinishedVerificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15904584/

相关文章:

java - 预期 Mockito 测试异常

python - 在 Python 中,如何编写可以访问私有(private)属性而不公开它们的单元测试?

java - 如何验证是否在模拟上调用了任何方法

java - 无法在 @Test Junit Selenium Web 驱动程序中使用定位器

java - 测试私有(private)变量 - 总是不好的做法?

java - 如何 stub 一个以泛型类作为参数的方法?

javascript - 如何用 Jest 模拟 redux Action

.net - 是否有任何 .net 等同于 Rails 固定装置?

java - 如何测试抛出的 IllegalArgumentException

java - 在删除文件内容之前创建单元测试