Как имитировать симулированный клиент

#spring-boot #mocking #netflix-feign

#весенняя загрузка #издевательство #netflix-feign

Вопрос:

Я не могу издеваться над своим притворным клиентом, используя Mockito.

MyService.class

 @Service
@AllArgsConstructor
public class MyService implements IMyService{

    private static final Logger LOGGER = LoggerFactory.getLogger(MyService .class);

    private final MyRepository repository;

    private final MyFeignClient myFeignClient;

    @Autowired
    private MyDao myDao;

    @Override
    @Async
    public void process(Map<UUID, Long> command) {
        DocIds docIds = getDocIds(command.values().stream().findFirst().get());
        archiveData(command.keySet().stream().findFirst().get(), documentIds.getIds());
    }

    private DocumentIds getDocIds(Long retentionId) {
        return myFeignClient.getDocumentIds(retentionId);
    }

private void archiveData(UUID execId, List<Long> docIds) {
    List<MyDocument> myDocs= prepareMyDocs(docIds);
    repository.saveAll(myDocs);
}
  

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

 @RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("test")
public class ArchiveServiceTest {

    @Autowired
    ArchiveService archiveService;

    @MockBean
    MyDao myDao;

    @MockBean
    DocRepository archiveRepository;

    @MockBean
    private MyFeignClient myFeignClient;


    @Test
    public void shouldReturnTheSameNumberOfDocumentsToArchive() {
        //given
        List<DocData> documentData = prepareDocumentData();
//      doReturn(new DocIds()).when(myFeignClient).getDocumentIds(1000L);
        DocumentIds documentIds = new DocumentIds();
        documentIds.setIds(Arrays.asList(1L, 2L));
        when(myFeignClient.getDocIds(any())).thenReturn(documentIds);
        when(documentDataDao.getAllDocumentData(anyList())).thenReturn(documentData);
        doNothing().when(archiveRepository.saveAll(any()));

        //when
        Map<UUID, Long> command = new HashMap<>();
        command.put(UUID.randomUUID(), 1000L);

        archiveService.process(command);

        //then
        ...
  

MyFeignClient:

 @FeignClient(name = "myFeignClient", url = "${feign.searcher.path}")
public interface MyFeignClient{

    @RequestMapping(method = RequestMethod.GET, path = "/document/path/{id}")
    DocIds getDocumentIds(@PathVariable("id") Long id);

}
  

При запуске теста,

 return myFeignClient.getDocumentIds(retentionId);
  

возвращает NULL. Почему?
У меня больше нет идей. Я не хочу использовать WireMock. То же самое происходит с моим documentDataDao, который не возвращает никаких значений (null), указанных в предложении thenReturn().

Ответ №1:

Вы пробовали это таким образом:

 Mockito.when(myFeignClient.getDocumentIds(Mockito.eq(1000L))).thenReturn(new DocIds());
  

В вашем примере макет закомментирован 😉

 //      doReturn(new DocIds()).when(myFeignClient).getDocumentIds(1000L);
  

Но я уверен, что это просто ошибка в вашем примере.

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

1. Не работает….