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

缺少方法调用验证(mock),但有一个?

孔和风
2023-03-14

我正在尝试做一个测试,它验证(使用Mockito v1.9.5的verify)在执行传递Foo后,在接口中调用带有签名deinit()方法。deinit(),我遇到了一个我真的不明白的错误。

这是的最脚印。我正在尝试运行的java

@RunWith(JukitoRunner.class)
public class FooTest {
    @Inject
    private Foo foo;
    @Inject
    private Bar bar;

    public static class TestModule extends JukitoModule {
        @Override
        protected void configureTest() {
            bind(Foo.class).to(FooImpl.class);
            bind(Bar.class).to(BarImpl.class);
            bindSpy(BarImpl.class);
        }
    }

    @Test
    public void testDeinit() {
        foo.init(mock(Baz.class));
        foo.deinit();
        verify(bar).deinit();
    }

    @After
    public void validate() {
        validateMockitoUsage(); //line YY
    }
}

运行此操作时,testDeinit()失败,出现以下错误:

org.mockito.exceptions.misusing.UnfinishedVerificationException:
Missing method call for verify(mock) here:
  -> at redacted.impl.BarImpl.deinit(BarImpl.java:XX)
  
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 redacted.impl.FooTest.validate(FooTest.java:YY)
at org.jukito.InjectedStatement.evaluate(InjectedStatement.java:96)
at org.jukito.InjectedAfterStatements.evaluate(InjectedAfterStatements.java:58)
at org.jukito.jukitoRunner.run(JukitoRunner.java:197)

我没能从中提取出多少有用的信息。似乎错误抱怨verify(bar)。deinit()也可以没有。deinit()结束,我可以删除该部分并得到相同的错误。错误消息中提供的示例尤其令人沮丧,因为它与我使用的verify几乎相同。

这是我的BarImpl.java

public class BarImpl implements Bar {
    private final Qux qux;
    private final Quux quux;

    @Inject
    public BarImpl(final Qux qux, final Quux quux) {
        this.qux = qux;
        this.quux = quux;
    }

    @Override
    private final void init(Baz baz) {
        quux.init(this);
        qux.init();
    }

    @Override
    public final void deinit() {
        qux.deinit();  //line XX
    }
}

我还不清楚qux是怎么回事。deinit()在此处导致故障。这是我的FooImpl。java

class FooImpl implements Foo {
    private final Bar bar;

    @Inject
    public FooImpl(final Bar bar) {
        this.bar = bar;
    }

    @Override
    public void init(Baz baz) {
        bar.init(baz);
    }

    @Override
    public void deinit() {
        bar.deinit(); 
    }
}

是什么导致未完成的VerificationException以及如何修复它?

我是个新手,所以我很可能错过了一些基本的东西。如果我能提供更多信息,请告诉我。对不起,如果这已经被回答了,我误解了这里的答案。


共有2个答案

巴洲
2023-03-14

在我的例子中,我得到这个消息是因为我试图对间谍(而不是模拟)执行verify()。我在做:

mySpy = Mockito.spy(<<constructor>>);

我不得不这样做:

mySpy = mock(MyClass.class, delegatesTo(<<constructor>>)
景胜涝
2023-03-14

实际上你的问题在错误信息中:

此外,可能会出现此错误,因为您验证了以下方法中的任何一个:最终/私有/equals()/hashCode()方法。这些方法无法存根/验证。

事实上,您尝试隐式验证对BarImpl#deinit的调用,这是一种final方法,Mockio不支持final方法模拟,如文档中所述。如果要验证它,您需要从BarImpl#deinit声明中删除关键字final,或者改用Powermock。

 类似资料:
  • 我正在面对 我已经检查了所有参数和要传递以验证的对象,但无法找出导致上述异常的原因 我要测试的条件, 测试用例 堆栈跟踪 我用同样的方法做了其他测试用例,它已经工作了,但是我不知道为什么它在这里不起作用,而且所有的方法都是公开的。请帮我弄清楚,谢谢

  • 我想在调用doSomething()时验证是否调用过一次someMethod。在doSomething()中,正在调用currentTimeMillis(),该值将不完全相同。我如何测试这个? 当前我收到以下错误消息: *org.mockito.exceptions.misusing.未完成验证例外: 此处缺少验证(模拟)的方法调用:- 正确验证示例:验证(模拟)。doSomething()* B

  • 问题内容: 我要求在通用api模块(多模块项目)中,我不能使用任何形式的hibernate的验证注释,因此我确实使用了javax.validation中的一个可接受的注释。 当我要验证包含NotBlank批注的域对象(我使用vaadin)时,问题就开始了。我得到以下异常 验证通过调用进行 相同的代码与hibernate的NotBlank完美配合 javax的@Size @NotNull也可以正常工

  • 问题内容: 我使用Spring 4.3.3.RELEASE,Hibernate 5.2.2.Final,数据库是MySQL。我想尝试一下 strategy = GenerationType.TABLE 。正如我对 GenerationType.SEQUENCE 所知, 我需要数据库中的序列来生成ID。 这是我的实体。 Spring注解配置 Spring xml配置 当我运行我的应用程序时,我得到

  • 问题内容: 我需要进行以下测试,以验证是否已调用Person类的所有getter。到目前为止,我已经使用了Mockito的verify()来确保每个getter都被调用。有没有办法通过反思做到这一点?可能是将新的吸气剂添加到Person类的情况,但是测试会错过这一点。 问题答案: 通常,不要嘲笑被测类。如果您的测试是针对Person的,则您永远都不会看到它,因为这很明显地表明您正在测试模拟框架而不

  • 我试图按照API密钥身份验证代码从这个答案:https://stackoverflow.com/a/48448901 我创建了我的过滤器类: 然后我实现了我的安全配置: 当我用头作为请求的一部分对应用程序进行外部调用时,我得到一个403禁止响应。我可以看到过滤器从头中拉出键。这部分正在工作。 但是,不会调用authenticate()方法来检查头是否有效。我不确定我错过了什么,代码在我看来是一样的