当前位置: 首页 > 知识库问答 >
问题:

Mockito给UnfinishedVerization异常时,它似乎可以

年风华
2023-03-14

当我认为我已经做了所有正确的事情时,Mockito似乎抛出了一个UnfinishedVerizationExc0019。这是我的部分测试案例:

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";
    }
}

忽略了一个事实,即您永远不应该模拟您不拥有的接口,为什么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

共有3个答案

段干弘扬
2023-03-14

由于使用了any()boolean参数,而显然它需要是anyBoolean()。

师博
2023-03-14

这是我自己遇到的,它给我带来了很多困惑。

正如上面David提到的,Mockito在下一个Mockito方法调用中报告错误,该调用可能不在同一个测试方法中。虽然异常消息确实包含对发生错误的实际位置的引用,但我发现错误测试失败会对测试过程产生反作用。测试越简单,下一次测试中出现错误的可能性就越大!

以下是一个简单的修复方法,可确保错误出现在正确的测试方法中:

@After
public void validate() {
    validateMockitoUsage();
}

从此处的Mockito文档:

如果您滥用它,Mockito会抛出异常,以便您知道您的测试是否编写正确。问题是Mockito在下次使用框架时进行验证(例如,下次验证、存根、调用mock等)。)。但是,即使在下一次测试中可能引发异常,异常消息也包含一个带有缺陷位置的可导航堆栈跟踪元素。因此,您可以单击并找到Mockito被滥用的地方。

不过,有时您可能希望显式验证框架用法。例如,其中一个用户希望将validateMockitoUsage()放在他的@After方法中,这样他就可以立即知道他何时误用了Mockito。如果没有它,他不会早于下次使用框架时就知道了。在@After中使用validateMockitoUsage()的另一个好处是,jUnit运行程序总是会在测试方法中失败,而普通的“下次”验证可能会在下一个测试方法中失败。但是,即使JUnit可能会将下一个测试报告为红色,也不要担心,只需单击异常消息中的可导航堆栈跟踪元素,即可立即找到您误用mockito的地方。

钱星辰
2023-03-14

如果您尝试验证一个需要带有any()的基元参数的方法,也可能会导致此问题:

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

method(long l, String s);

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

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

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

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

 类似资料:
  • 出于某种原因,在每秒27个请求的情况下,我们开始发现okhttp有时会出现问题,我们注意到每个主机的请求限制为5个。我们正在讨论的api有时会出现问题/超时等。 我注意到我们没有在超时时取消请求,它们似乎仍在飞行中。(即。我想开始使用RealCall.cancel) 在调查这件事的过程中。取消呼叫引擎。取消()如果引擎不为null,则调用streamAllocation。cancel()调用以下代

  • 问题内容: 我目前在Spring Boot 1.4.2上玩耍,在其中我已经加入了Spring-boot-starter-web和Spring-boot-starter- jpa。 我的主要问题是,当我保存一个新实体时,它可以正常工作(非常酷)。 但是,如果我用相同的ID(例如重复条目)保存一个新产品实体,则不会引发异常。我期待的是ConstrintViolationException或类似的东西。

  • 我使用改装: 2.0.0-beta4为我的Android应用程序。 我试图添加一个改型用户,该用户已在数据库中正确创建,但出现以下错误: 服务器返回的结果是: 这是正确的json格式,我不明白为什么会出现这样的异常? 下面是我的界面: 调用方代码是: 有人能提供线索吗?

  • 我目前正在使用Spring Boot1.4.2,我在其中加入了Spring-boot-starter-web和spring-boot-starter-jpa。 我的主要问题是,当我保存一个新的实体时,它工作得很好(一切都很酷)。 但是,如果我用相同的id保存一个新的产品实体(例如重复的条目),它不会抛出异常。我期待的是ConstrintViolationException或类似的东西。 考虑到以下

  • 我应该如何测试异常?我可以mock connector并且我可以赋予它抛出异常的行为,但是我不明白下一步该怎么做。

  • 我有一个代码如下: 当我尝试运行代码时,我得到这样的消息: 我提到了这个链接,但不明白如何修改上面的代码,使其可行:例外:需要mockito,但没有调用,实际上与这个mock没有任何交互 有人能帮忙吗。 通过添加c.getResult(新的A(新的B()),新的F())解决了上述错误;在上面 我错过了什么?我一直在使用的课程: