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

运行代码时获取Mockito异常

梁嘉澍
2023-03-14

我有一个代码如下:

public class D {
    public static void main(String[] args) {
        C c = Mockito.mock(C.class);
        G g = Mockito.mock(G.class);
        doReturn(g).when(c).getResult(eq(new A(new B())), eq(new F()));
        verify(c, times(1)).getResult(eq(new A(new B())), eq(new F()));
    }
}

当我尝试运行代码时,我得到这样的消息:

Exception in thread "main" Wanted but not invoked:
c.getResult(
    info.sanaulla.A@46f5f779,
    info.sanaulla.F@1c2c22f3
);
-> at info.sanaulla.D.main(D.java:15)
Actually, there were zero interactions with this mock.

    at info.sanaulla.D.main(D.java:15)

我提到了这个链接,但不明白如何修改上面的代码,使其可行:例外:需要mockito,但没有调用,实际上与这个mock没有任何交互

有人能帮忙吗。

通过添加c.getResult(新的A(新的B()),新的F())解决了上述错误;在上面

Exception in thread "main" Argument(s) are different! Wanted:
c.getResult(
    info.sanaulla.A@12bc6874,
    info.sanaulla.F@4c75cab9
);
-> at info.sanaulla.D.main(D.java:17)
Actual invocation has different arguments:
c.getResult(
    info.sanaulla.A@de0a01f,
    info.sanaulla.F@1ef7fe8e
);
-> at info.sanaulla.D.main(D.java:16)

    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    at info.sanaulla.D.main(D.java:17)

我错过了什么?我一直在使用的课程:

public final class A {
    B b;
    public A(B b) {
        this.b = b;
    }
}

public class B {
}

public class C {
    public C() {

    }

    public G getResult(A a, F f) {
        G g = new G();
        return g;
    }
}
public class F {

}

共有2个答案

陈文景
2023-03-14

尝试以下方法:

public class D {
    public static void main(String[] args) {
        // mock a dummy so that we do not have to call A's actual methods
        A a = Mockito.mock(A.class);
        when(a.foo()).thenReturn("bar");            

        // run the actual method of C
        new C().getResult(a, new F());

        // verifies that this method was called
        verify(c, times(1)).getResult(any(A.class), any(F.class));
    }
}

您不应该嘲笑您想要测试的类,因为这将创建一个虚拟对象。当方法被调用时,所有的都是用来告诉你的虚拟类返回什么。

申屠恺
2023-03-14

你永远不会调用mock c的函数。

检查mock c是否在测试用例中被调用一次。

更新:

将您的代码更改为:

public class D {
    public static void main(String[] args) {
        C c = Mockito.mock(C.class);
        G g = Mockito.mock(G.class);
        B b = new B();
        A a = new A();
        F f = new F();
        doReturn(g).when(c).getResult(eq(a), eq(f));
        c.getResult(a, f); 
        verify(c, times(1)).getResult(eq(a), eq(f));

    }
}

因为在你的代码中,你曾经创建过一个对象的新实例,在每次初始化之后,它都是不同的。

 类似资料:
  • 我正在使用蓝牙LE来获取周围的设备,但是我没有得到一个列表,而且我还得到一个运行时异常,这里是stack-trace 代码在这里 我不明白为什么data抛出null

  • 我正在使用以下联系人获取应用程序的代码,我正在获得Android运行时:致命的异常:第17行的主要错误。 下面是我的logcat E/AndroidRuntime:致命异常:主进程:com.example.alpesh_pc.contactList,PID:3833 java.lang.RuntimeException:无法启动activity组件信息{com.example.alpesh_pc.

  • 本节将介绍如何获取本书的代码和安装运行代码所依赖的软件。虽然跳过本节不会影响后面的阅读,但我们还是强烈建议读者按照下面的步骤来动手操作一遍。本书大部分章节的练习都涉及改动代码并观察运行结果。因此,本节是完成这些练习的基础。 获取代码并安装运行环境 本书的内容和代码均可在网上免费获取。我们推荐使用conda来安装运行代码所依赖的软件。conda是一个流行的Python包管理软件。Windows和Li

  • 我的项目有OCR要求,我想使用google cloud Vision API。我通过GIT下载了示例代码,但它报告了以下错误: 异常在线程"main"mpl.java:392SocketTimeoutException:连接超时在java.net.DualStackPlainSocketIocket.connectForConnect(Native Method)在ocket.java:589Du

  • 我正在LiquiBase中运行Java代码变更集。但是我遇到了这个问题,我得到了ClassNotFoundException,我四处搜索了一下,但是没有找到任何有用的东西。在这个环节上的一些研究是有用的。我使用的是Liquibase-Core-2.0.1。

  • 我使用下面的命令进行了mockito-junit测试。变量serviceTask是接口的实例,称为serviceTask。我在申报中使用了@Mock 声明: 命令行: 堆栈跟踪: Java语言lang.NullPointerException在sun。反映NativeMethodAccessorImpl。sun上的invoke0(本机方法)。反映NativeMethodAccessorImpl。在