Mockito 不能在 Spock 测试中监视 class 吗?

Cannot Mockito spy class in Spock test?

我正试图在 Spock 测试中监视 Java class。我之前在 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) 时,它工作正常。

我已确认 class 不是最终的、匿名的或原始的。

有什么想法吗?我在 class (ak) 中有一个随机生成器,所以我需要监视而不是模拟。

谢谢

Mockito 不会监视 类(或模拟),它会监视(常规)对象。因此,而不是

def service = spy(Service.class)

你必须写

def service = spy(new Service())

(或适合您的场景的构造函数)。

除了 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.

由于你窥探后没有调用这个方法