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.