Я работаю над тестовым классом, где одному конкретному тесту нужна фактическая реализация метода класса обслуживания, над которым я издеваюсь.Поэтому я подумал, почему бы не использовать @SpyBean
вместо @MockBean
и использовать фактическую реализацию там, где мне это нужно (не нужно ничего делать), и использовать фиктивную реализацию там, где мне это нужно (нужно написать однострочник)чтобы настроить поддельный метод).
Я нашел этот замечательный и довольно подробный пост в блоге , в котором объясняется, как этого добиться, раздел "@SpyBean to the help".
Единственная проблема в том, что она не работает, используется реальная реализация, и эти тесты успешны, но проверенные методы не запускаются. Я использую 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
Кто-нибудь знает, как это сделать?