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
3 Réponses :
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));
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
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
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