如何模拟SpyBean的各个方法?

时间:2019-04-18 09:28:41

标签: java spring mocking mockito spy

我正在测试一个测试类,其中一个特定的测试需要我模拟的服务类方法的实际实现。所以我想,为什么不使用@SpyBean而不是@MockBean并在需要的地方使用实际的实现(无需做任何事情),而在需要的地方使用模拟的实现(需要编写)一线即可设置模拟方法。

我发现this great and quite detailed blog post,在“ @SpyBean的营救”部分说明了如何实现此目的。

唯一的问题是它不起作用,使用了实际的实现,并且那些测试成功了,但是模拟方法没有启动。我正在使用Mockito 2.21.0和Spring Framework 5.1.0。现在,我为此目的使用了单独的测试类,但是我想弄清楚如何正确执行此操作。

我正在做与本博客示例完全相同的事情:

@SpringBootTest(classes = TestclassAA.class)
class TestclassAA {
@SpyBean
private XXService xxService;

private ClassUsingXXService testee;

@Test
void test1 {
   // ..
   // use mocked implementation of save() -> does not work, real method called
   doReturn(new XXRequestModel()).when(xxService).save(any(XXModel.class));
   var result = testee.doSomething();
   //.. 
}

@Test
void test2 {
  // ..
  // use actual implementation of save() -> works, real method called
  var result = testee.doSomething();
  //.. 
}

基本上,我收到错误消息,提示我做的事情根本不可能是间谍:

org.mockito.exceptions.misusing.NotAMockException: 
Argument passed to when() is not a mock!
Example of correct stubbing:
doThrow(new RuntimeException()).when(mock).someMethod();

E.g. thenReturn() may be missing.
Examples of correct stubbing:
when(mock.isOk()).thenReturn(true);
when(mock.isOk()).thenThrow(exception);
doThrow(exception).when(mock).someVoidMethod();

Hints:
1. missing thenReturn()
2. you are trying to stub a final method, which is not supported
3: you are stubbing the behaviour of another mock inside before 'thenReturn' instruction if completed

有人知道怎么做吗?

0 个答案:

没有答案