Как издеваться над отдельными методами SpyBean? - PullRequest
0 голосов
/ 18 апреля 2019

Я работаю над тестовым классом, где одному конкретному тесту нужна фактическая реализация метода класса обслуживания, над которым я издеваюсь.Поэтому я подумал, почему бы не использовать @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

Кто-нибудь знает, как это сделать?

...