2
votes

WrongTypeOfReturnValue: "Object" ne peut pas être retourné par findById ()

J'essaye de faire des tests pour mon application Spring Boot et j'ai un gros problème. Voici à quoi ressemble mon erreur:

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

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

Je suivais des tutoriels et tout le monde utilise findOne () , mais pour moi, cela ne fonctionne tout simplement pas. Mon IDE affiche:

"Le type inféré 'S' pour le paramètre de type 'S' n'est pas dans ses limites; devrait étendre 'com.java.workitemservice.model.WorkItem"

C'est pourquoi j'ai essayé l'inverse et utilisé findById () , mais j'ai eu une autre erreur.

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

Mon référentiel:

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

    Optional <WorkItem> findWorkItemBySubject(String subject);
    }

Ma méthode de service:

{ 
    @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());
    }
}

Ma méthode de contrôleur:

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


0 commentaires

3 Réponses :


3
votes

Comme l'indique l'erreur, vous ne retournez pas ce que la signature de la méthode déclare comme un type de retour (qui est Optional )

Renvoyez simplement

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


3 commentaires

J'ai essayé et il montre "Impossible de résoudre la méthode 'thenReturn (java.util.Optional )"


Pourriez-vous essayer de remplacer workItemRepository.findById (1L) .orElse (null) par simplement workItemRepository.findById (1L) ?


Il se compile, mais le pointeur Null apparaît dans cette ligne "WorkItem workItem2 = workItemsController.getWorkItemById (1L);" Dois-je changer ma méthode de service et de contrôleur pour renvoyer facultatif au lieu de WorkItem?



0
votes

vous devez ajouter la méthode get () lorsque vous appelez findbyId () La plupart des méthodes du référentiel renvoient un

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

facultatif


0 commentaires

0
votes

Je vois dans les commentaires que vous avez essayé ceci:

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

Cela devrait fonctionner. Je pense que le problème vient de votre appel 'orElse'.

Pour être précis, voici la méthode quand:

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

Donc je pense que l'utilisation 'orElse' empêche 'T' d'être inféré.

Et ma question est pourquoi utiliser 'orElse'? Vous écrasez la méthode.

Vous pouvez utiliser 'anyString' pour faire correspondre n'importe quel paramètre.

Cheers


0 commentaires