Mockito SpyBean выдает исключение UnfinishedStubbingException

#java #spring #mockito

#java #spring #mockito

Вопрос:

Я пытаюсь частично имитировать службу, используя Spy от Mockito, переопределяя метод, чтобы заставить его возвращать согласованные данные для тестирования, но указанный spy выдает исключение UnfinishedStubbingException без видимой причины.

Это мой тестовый класс:

 @SpringBootTest
@RunWith(SpringRunner.class)
public class ApplicationIT {

    private CompletableFuture<JobList> jobList;

    @SpyBean
    private Service serviceSpy;

    @Before
    public void setUp() {
        initMocks(this);

        jobList = new CompletableFuture<>();
        jobList.complete(jobList.newBuilder()
                .addAllJobs(jobTestData.getTestJob().getJobs()).build()); 

        Mockito.doReturn(jobList).when(serviceSpy).fetchJob();  
        Mockito.doNothing().when(serviceSpy).reportSuccess(Mockito.any());
    }

    @Test
    public void fetchJobCallTest() {
        Mockito.verify(serviceSpy, timeout(60000).atLeastOnce()).fetchJob();
    }

    @Test
    public void reportSuccessCallTest() {       
        Mockito.verify(serviceSpy, timeout(60000).atLeastOnce()).reportSuccess(Mockito.any());
    }
}
  

Оба теста завершаются с ошибкой, org.mockito.exceptions.misusing.UnfinishedStubbingException указывающей на Mockito.doReturn(jobList).when(serviceSpy).fetchJob(); at Mockito.doNothing().when(serviceSpy).reportSuccess(Mockito.any());

Ответ №1:

 UnfinishedStubbingException means you are not mocking properly
this is not the right way of mocking a method... Mockito.doReturn(jobList).when(serviceSpy).fetchJob();
You can try below...
Examples of correct stubbing:
    when(mock.isOk()).thenReturn(true);
    when(mock.isOk()).thenThrow(exception);
    doThrow(exception).when(mock).someVoidMethod();
  

Комментарии:

1. Я попадаю в третий случай: doThrow(exception).when(mock).someVoidMethod(); -> doReturn(jobList).when(serviceSpy).fetchJob();

2. fetchJob() является частным методом или общедоступным методом?… скажите мне, чтобы я мог точно сказать вам, чего вы хотите

3. fetchJob() является @Async public CompletableFuture<JobList> методом