Java >> Java tutorial >  >> Tag >> throw

Hånende undtagelse Kast med Mockito

1. Oversigt

I denne hurtige vejledning vil vi fokusere på, hvordan man konfigurerer et metodekald til at kaste en undtagelse med Mockito.

For mere information om biblioteket, se også vores Mockito-serie.

Her er den simple ordbogsklasse, som vi vil bruge:

class MyDictionary {
    private Map<String, String> wordMap = new HashMap<>();

    public void add(String word, String meaning) {
        wordMap.put(word, meaning);
    }

    public String getMeaning(String word) {
        return wordMap.get(word);
    }
}

Yderligere læsning:

Sørg for, at en undtagelse er kastet i JUnit 4 og 5

Tag et kig på, hvordan du tester, om en undtagelse blev kastet med JUnit. Læs mere →

Mockitos Java 8-funktioner

Oversigt over Java 8-understøttelse i Mockito-framework, inklusive streams og standardgrænseflademetoderLæs mere →

AssertJ Exception Assertions

Lær, hvordan du bruger AssertJ til at udføre påstande om undtagelser. Læs mere →

2. Ikke-ugyldigt Returtype

For det første, hvis vores metode returtype ikke er ugyldig , kan vi bruge when().thenThrow() :

@Test(expected = NullPointerException.class)
public void whenConfigNonVoidRetunMethodToThrowEx_thenExIsThrown() {
    MyDictionary dictMock = mock(MyDictionary.class);
    when(dictMock.getMeaning(anyString()))
      .thenThrow(NullPointerException.class);

    dictMock.getMeaning("word");
}

Bemærk, at vi konfigurerede getMeaning() metode — som returnerer en værdi af typen String — for at kaste en NullPointerException når du bliver ringet op.

3. Ugyldig Returtype

Nu, hvis vores metode returnerer ugyldig, vi bruger doThrow() :

@Test(expected = IllegalStateException.class)
public void whenConfigVoidRetunMethodToThrowEx_thenExIsThrown() {
    MyDictionary dictMock = mock(MyDictionary.class);
    doThrow(IllegalStateException.class)
      .when(dictMock)
      .add(anyString(), anyString());

    dictMock.add("word", "meaning");
}

Her konfigurerede vi en add() metode — som returnerer void — at kaste IllegalStateException når du bliver ringet op.

Vi kan ikke bruge when().thenThrow() med ugyldigt returtype, da compileren ikke tillader ugyldig metoder inden for parentes.

4. Undtagelse som objekt

For at konfigurere selve undtagelsen kan vi videregive undtagelsens klasse som i vores tidligere eksempler eller som et objekt:

@Test(expected = NullPointerException.class)
public void whenConfigNonVoidRetunMethodToThrowExWithNewExObj_thenExIsThrown() {
    MyDictionary dictMock = mock(MyDictionary.class);
    when(dictMock.getMeaning(anyString()))
      .thenThrow(new NullPointerException("Error occurred"));

    dictMock.getMeaning("word");
}

Og vi kan gøre det samme med doThrow() :

@Test(expected = IllegalStateException.class)
public void whenConfigVoidRetunMethodToThrowExWithNewExObj_thenExIsThrown() {
    MyDictionary dictMock = mock(MyDictionary.class);
    doThrow(new IllegalStateException("Error occurred"))
      .when(dictMock)
      .add(anyString(), anyString());

    dictMock.add("word", "meaning");
}

5. Spion

Vi kan også konfigurere Spy at kaste en undtagelse på samme måde, som vi gjorde med mock:

@Test(expected = NullPointerException.class)
public void givenSpy_whenConfigNonVoidRetunMethodToThrowEx_thenExIsThrown() {
    MyDictionary dict = new MyDictionary();
    MyDictionary spy = Mockito.spy(dict);
    when(spy.getMeaning(anyString()))
      .thenThrow(NullPointerException.class);

    spy.getMeaning("word");
}

6. Konklusion

I denne artikel undersøgte vi, hvordan man konfigurerer metodekald til at kaste en undtagelse i Mockito.

Som altid kan den fulde kildekode findes på GitHub.


Java tag