Java >> Java tutorial >  >> Tag >> assert

Påstå, at et objekt er fra en bestemt type

1. Oversigt

I denne artikel vil vi undersøge, hvordan vi kan verificere, at et objekt er af en bestemt type. Vi vil se på forskellige testbiblioteker og hvilke metoder de tilbyder til at hævde objekttypen.

Scenariet, hvor vi muligvis skal gøre dette, kan variere. En almindelig er, når vi bruger en grænseflade som en returtype for en metode, men så, i henhold til det specifikke returnerede objekt, ønsker vi at udføre forskellige operationer. Enhedstest kan hjælpe os med at bestemme hvis det returnerede objekt har den klasse, vi forventer.

2. Eksempelscenarie

Lad os forestille os, at vi sorterer træer efter, om de mister deres blade hen over vinteren eller ej. Vi har to klasser, Evergreen  og Løvfældende, begge implementerer et Træ grænseflade. Vi har en simpel sorterer, der returnerer den korrekte type i henhold til navnet på træet:

Tree sortTree(String name) {

    List<String> deciduous = List.of("Beech", "Birch", "Ash", "Whitebeam", "Hornbeam", "Hazel & Willow");
    List<String> evergreen = List.of("Cedar", "Holly", "Laurel", "Olive", "Pine");

    if (deciduous.contains(name)) {
        return new Deciduous(name);
    } else if (evergreen.contains(name)) {
        return new Evergreen(name);
    } else {
        throw new RuntimeException("Tree could not be classified");
    }
}

Lad os undersøge, hvordan vi kan teste, hvilken type træ er faktisk returneret.

2.1. Test med JUnit5

Hvis vi vil bruge JUnit5, kan vi kontrollere, om klassen af ​​vores objekt er lig med den klasse, vi tester mod ved at bruge assertEquals metode :

@Test
public void sortTreeShouldReturnEvergreen_WhenPineIsPassed() {
    Tree tree = tested.sortTree("Pine");
    assertEquals(tree.getClass(), Evergreen.class);
}

2.2. Test med Hamcrest

Når du bruger Hamcrest-biblioteket, kan vi bruge assertThat og instanceOf  metoder :

@Test
public void sortTreeShouldReturnEvergreen_WhenPineIsPassed() {
Tree tree = tested.sortTree("Pine");
assertThat(tree, instanceOf(Evergreen.class));
}

Der er en genvejsversion tilgængelig for os, når vi importerer med org.hamcrest.Matchers.isA :

assertThat(tree, isA(Evergreen.class));

2.3. Test med AssertJ

Vi kan også bruge AssertJ Core bibliotekets isExactlyInstanceOf metode :

@Test
public void sortTreeShouldReturnEvergreen_WhenPineIsPassed() {
    Tree tree = tested.sortTree("Pine");
    assertThat(tree).isExactlyInstanceOf(Evergreen.class);
}

En anden måde at udføre den samme test på er med hasSameClassAs metode :

@Test
public void sortTreeShouldReturnDecidious_WhenBirchIsPassed() {
    Tree tree = tested.sortTree("Birch");
    assertThat(tree).hasSameClassAs(new Deciduous("Birch"));
}

3. Konklusion

I denne øvelse har vi set et par forskellige eksempler på at verificere typen af ​​et objekt i enhedstests. Vi har vist en simpel Junit5 eksempel samt brug af metoder fra Hamcrest og AssertJ biblioteker. Begge Hamcrest og AssertJ tilbyde yderligere nyttige oplysninger i deres fejlmeddelelser.

Som altid er koden til dette eksempel tilgængelig på GitHub.


Java tag