WrongTypeOfReturnValue: функция «Object» не может быть возвращена функцией findById () - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь выполнить тесты для моего загрузочного приложения Spring, и у меня большая проблема.Вот как выглядит моя ошибка:

org.mockito.exceptions.misusing.WrongTypeOfReturnValue: 
WorkItem cannot be returned by findById()
findById() should return Optional

Я следовал инструкциям, и все используют findOne(), но для меня это просто не работает.Моя IDE показывает:

"Предполагаемый тип 'S' для параметра типа 'S' не входит в его пределы; должен расширять 'com.java.workitemservice.model.WorkItem"

Вот почему я попробовал это по-другому и использовал findById(), но затем я получил другую ошибку.

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

    @Mock  
    private WorkItemRepository workItemRepository;

    @InjectMocks
             WorkItemsController workItemsController;

    @Before
    public void init() {
    MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testGetUserById() {
    WorkItem workItem = new WorkItem();
    workItem.setId(1L);

    //old version
    //when(workItemRepository.findOne(1L)).thenReturn(workItem);
    when(workItemRepository.findById(1L).orElse(null)).thenReturn(workItem);

    WorkItem workItem2 = workItemsController.getWorkItemById(1L);

    verify(workItemRepository).findById(1L).orElse(null);

    assertEquals(1L, workItem2.getId().longValue());
    }
}

Мой репозиторий:

    @Repository
    public interface WorkItemRepository extends JpaRepository<WorkItem, 
    Long> {

    Optional <WorkItem> findWorkItemBySubject(String subject);
    }

Мой метод обслуживания:

    public WorkItem getWorkItemById(Long id) {
    return this.workItemRepository.findById(id)
    .orElseThrow(() -> new 
    ResourceNotFoundException("WorkItem", "id", id));
    }

Метод моего контроллера:

    @GetMapping("/workItems/{id}")
    public WorkItem getWorkItemById(@PathVariable(value = "id") Long 
    workItemId) {

    return this.workItemService.getWorkItemById(workItemId);
    }
}

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

вам нужно добавить mothod get () при вызове findbyId (). Большинство методов в репозитории возвращает необязательный

  public WorkItem getWorkItemById(Long id) {
    return this.workItemRepository.findById(id).get()
    .orElseThrow(() -> new 
    ResourceNotFoundException("WorkItem", "id", id));
    }
0 голосов
/ 14 февраля 2019

Я вижу в комментариях, что вы пробовали это:

when(workItemRepository.findById(1L).orElse(null)).thenReturn(Optional.of(workitem));

Это должно работать.Я думаю, что проблема исходит от вашего вызова 'orElse'.

Если быть точным, вот метод, когда:

public static <T> OngoingStubbing<T> when(T methodCall) {
        return MOCKITO_CORE.when(methodCall);
    }

Так что я думаю, что использование 'orElse' предотвращает 'T'от логического вывода.

И мой вопрос: зачем использовать 'orElse'?Вы заглушаете метод.

Вы можете использовать 'anyString' для соответствия любому параметру.

Приветствия

0 голосов
/ 14 февраля 2019

Как говорится в сообщении об ошибке, вы не возвращаете то, что подпись метода объявляет как тип возвращаемого значения (то есть Optional<WorkItem>)

Просто возвращаете

Optional.of(workitem) 

вместо workItem, т.е.:

when(workItemRepository.findById(1L).orElse(null)).thenReturn(Optional.of(workitem));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...