1. 概述

在本文中,我们将探讨如何验证一个对象是否具有特定类型。我们将关注不同的测试库及其提供的方法来断言对象类型。

我们可能需要这样做的场景可能会有所不同。一个常见的例子是,当我们使用接口作为方法的返回类型时,然后根据返回的具体对象执行不同的操作。单元测试可以帮助我们确定返回的对象是否是我们期望的类。

2. 示例场景

想象一下,我们要根据树木是否在冬季落叶对它们进行排序。我们有两个类:EvergreenDeciduous,两者都实现了 Tree 接口。我们有一个简单的排序器,根据树的名字返回正确的类型:

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");
    }
}

接下来,我们将探讨如何测试实际返回的是哪种类型的 Tree

2.1. 使用 JUnit5 进行测试

如果我们想使用 JUnit5,我们可以使用 assertEquals 方法来检查我们的对象类是否等于我们正在测试的类:

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

2.2. 使用 Hamcrest 进行测试

当使用 Hamcrest 库时,我们可以使用 assertThatinstanceOf 方法:

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

当我们导入 org.hamcrest.Matchers.isA 时,有一个便捷的方法可用:

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

2.3. 使用 AssertJ 进行测试

我们还可以使用 AssertJ Core 库的 isExactlyInstanceOf 方法:

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

另一种实现相同测试的方法是使用 hasSameClassAs 方法:

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

3. 总结

在这篇教程中,我们展示了几种在单元测试中验证对象类型的实例。我们展示了使用 JUnit5 的简单示例,以及 Hamcrest 和 AssertJ 库的方法。Hamcrest 和 AssertJ 都提供了额外的错误消息信息。

如往常一样,本例的代码可以在 GitHub 上找到。


« 上一篇: Java Weekly, 第413期