我正试图在Spock测试中窥探Java类。我之前在Spock / Groovy中没有遇到过Mockito的问题。
当我尝试执行以下操作时:
def service = spy(Service.class)
我收到以下错误:
org.mockito.exceptions.base.MockitoException:
Cannot mock/spy class java.lang.Class
Mockito cannot mock/spy following:
- final classes
- anonymous classes
- primitive types
当我做mock(Service.class)
时,它可以正常工作。
我已经确认该课程不是最终的,匿名的或原始的。
有什么想法吗?我在课堂上有一个随机生成器(ak)所以我需要间谍不要模拟。
谢谢
答案 0 :(得分:3)
Mockito并没有监视Classes(或Mocks),它会窥探(常规)对象。因此,而不是
def service = spy(Service.class)
你必须写
def service = spy(new Service())
(或适用于您的场景的任何构造函数)。
答案 1 :(得分:0)
对Ray的答案来说,你也可以窥探已经创建的实例。唯一的问题是,在调用spy()
之前调用的所有方法都无法验证。像:
ClassToSpy spiedInstance;
@Before
public void before () {
spiedInstance = new ClassToSpy();
}
@Test
public void testWillFail() {
spiedInstance.method();
spiedInstance = spy(spiedInstance);
verify(spiedInstance).method();
}
@Test
public void testWillPass() {
spiedInstance = spy(spiedInstance);
spiedInstance.method();
verify(spiedInstance).method();
}
您从testWillFail
获得的错误类似于:
Wanted but not invoked:
classToSpy.method();
-> at your.package.testWillFail(TestClass.java:line)
Actually, there were zero interactions with this mock.
由于在发现间谍后你没有调用这种方法。