运行 代码时获取 Mockito 异常
Getting Mockito exception while running code
我有如下代码:
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)
我参考了这个 link 但无法理解如何修改上面的代码以使其可行: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 {
}
你永远不会调用 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));
}
}
因为在您的代码中您曾经创建一个对象的新实例,每次初始化后都不同。
尝试以下操作:
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
您想要测试的 class,因为那样会创建一个虚拟对象。所有 when
方法都是为了告诉你的虚拟 classes 在调用它们的方法时 return 要做什么。
我有如下代码:
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)
我参考了这个 link 但无法理解如何修改上面的代码以使其可行: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 {
}
你永远不会调用 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));
}
}
因为在您的代码中您曾经创建一个对象的新实例,每次初始化后都不同。
尝试以下操作:
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
您想要测试的 class,因为那样会创建一个虚拟对象。所有 when
方法都是为了告诉你的虚拟 classes 在调用它们的方法时 return 要做什么。