在Spock测试中不能Mockito间谍课吗?

时间:2015-06-16 18:20:42

标签: java groovy mocking mockito spock

我正试图在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)所以我需要间谍不要模拟。

谢谢

2 个答案:

答案 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.

由于在发现间谍后你没有调用这种方法。