我正在测试一个测试类,其中一个特定的测试需要我模拟的服务类方法的实际实现。所以我想,为什么不使用@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
有人知道怎么做吗?