Przekształcałem kod w asynchroniczny. Oryginalny test jednostki użył adnotacji @Test(expected = MyExcpetion.class)
, ale nie sądzę, że to zadziała, ponieważ wyjątek, który chcę potwierdzić, jest zawarty w java.util.concurrent.ExcutionException
. Próbowałem nazywając moją przyszłość tak, ale moje twierdzenie jest nadal nie i nie kocham, że muszę dodać w return null
Jak mogę przetestować wyjątek w pełni możliwej do zrealizowania w przyszłości?
myApiCall.get(123).exceptionally((ex) -> {
assertEquals(ex.getCause(),MyCustomException.class)
return null
}
Próbowałem też tego smaku, ale nadal nie działa
myApiCall.get(123).exceptionally((ex) -> {
assertThat(ex.getCause())
.isInstanceOF(MyException.class)
.hasMessage("expected message etc")
return null;
}
Mój interfejs API zgłasza wyjątek, jeśli nie może znaleźć identyfikatora. Jak powinienem to właściwie testować? Czy mogę mimo to użyć tej oryginalnej adnotacji?
Moje połączenie api dociera do db po uruchomieniu. W tym teście ustawiam swoją przyszłość, aby zwrócić błąd, więc właściwie nie próbuję się z niczym komunikować. kod badanego wygląda następująco
public class myApiCall {
public completableFuture get(final String id){
return myService.getFromDB(id)
.thenApply(
//code here looks at result and if happy path then returns it after
//doing some transformation
//otherwise it throws exception
)
}
}
w badanej jednostki wymusić myService.getFromDB(id)
powrotu złych danych, dzięki czemu można przetestować wyjątek, a także zachować ten test jednostki nie docierać do db itp
Przypuszczalnie twoi "dostają" delegatów do innego wątku. Zauważ, że JUnit nie czeka na zakończenie. Jeśli zakończy swoją metodę testową, zakończy proces Java. Zamiast tego 'get' na CF, aby czekać na wynik. Jeśli jest wyjątek, rozwiń go i zapewnij tam (lub wyrzuć go ponownie i użyj swojego 'expected'). –
Co to jest myApiCall? – fxrbfg
api po prostu dociera do db dla danych.pozwól mi zaktualizować coś w powyższym kodzie, więc być może jego jaśniejsze – Barry