2016-05-03 6 views
3

Während des Tests wird eine NullPointerException ausgelöst. Ich habe versucht, es zu debuggen und das einzige, was ich ausgearbeitet habe, war, dass eventOptional immer null ist. Genau wie wenn Mockito.when(). DannReturn() nicht funktioniert. Kann jemand helfen? Hier ist mein Code für einen getesteten Service und für den Test selbst:Mockito.when(). ThenReturn() funktioniert nicht oder gibt null zurück

@Service 
public class EventService { 

    @Autowired 
    public EventService(EventRepository eventRepository) { 
     this.eventRepository = eventRepository; 
    } 
    //... 
    public void updateEvent(EventDTO eventDTO) { 
     Optional<Event> eventOptional = eventRepository.findOneById(eventDTO.getId()); 

     eventOptional.orElseThrow(() -> new BadRequestException(EVENT_NOT_FOUND)); 
     //... 
    } 
} 

und die Testklasse:

@RunWith(MockitoJUnitRunner.class) 
public class EventServiceTest { 

    @Mock 
    private EventRepository eventRepository; 
    @InjectMocks 
    private EventService eventService; 

    private Event sampleEventFromDb; 

    @Before 
    public void setUp() throws Exception { 

     MockitoAnnotations.initMocks(this); 
    } 

    @Test 
    public void shouldUpdateEventTestAndWithProperTime() throws Exception { 
     EventDTO eventDTOMock = Mockito.mock(EventDTO.class); 

     sampleEventFromDb = Event.builder() 
      .name("name") 
      .startDateTime(LocalDateTime.now()) 
      .placeName("place") 
      .description("description") 
      .publicEvent(true) 
      .owner(new User()) 
      .build(); 

     Mockito.when(eventRepository.findOneById(anyString())).thenReturn(Optional.of(sampleEventFromDb)); 
     Mockito.when(eventDTOMock.getId()).thenReturn("1"); 

     eventService.updateEvent(eventDTOMock); //NullPointerException 
     //... 
    } 
} 
+1

Sie müssen MockitoAnnotations.initMocks (this) nicht ausführen, wenn Sie den Test mit dem MockitoJUnitRunner ausführen. Stellen Sie außerdem sicher, dass die findOneById-Methode nicht als statisch, privat oder final deklariert ist. – mdewit

+0

@SotiriosDelimanolis, wird es durch den Läufer und/oder initMocks unter Verwendung der Reflexion initialisiert. Und es ist tatsächlich in diesem Beispiel initialisiert - ich habe es gerade überprüft. Das lustige ist, funktioniert bei TestNG gut, scheitert aber bei JUnit. Dies ist sicherlich kein Duplikat, also habe ich gewählt, um wieder zu öffnen. –

+0

Eigentlich als ich MockitoJunitRunner einfach aufgab und das Repository manuell mokierte sowie den Dienst über seinen Konstruktor initialisierte - es funktioniert jetzt perfekt. – HectorBarbossa

Antwort

0

wie das Problem sieht, ist, dass initMock zweimal aufgerufen: einmal durch den Läufer und einmal durch die setUp Methode. Das Ausführen des Tests mit dem regulären Runner oder das Entfernen des initMocks-Aufrufs von der setUp-Methode behebt dieses Problem.