运行代码时获取Mockito异常

时间:2015-08-21 10:37:26

标签: java mockito

我有以下代码:

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)

我引用了此链接,但无法理解如何修改上述代码以使其可行:Exception : mockito wanted but not invoked, Actually there were zero interactions with this mock

有人可以帮忙。

通过添加c.getResult(new A(new B()),new 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 个答案:

答案 0 :(得分:3)

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

verify检查模拟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));

    }
}

因为在您的代码中,您创建了一个对象的新实例,每次启动后都会有所不同。

答案 1 :(得分:0)

尝试以下方法:

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

您永远不应该mock要测试的类,因为这会创建一个虚拟对象。所有when方法都用于告诉您的虚拟类在调用它们的方法时要返回什么。