如何测试枚举类型?

新手上路,请多包涵

我目前正在尝试为小型图书馆构建或多或少完整的单元测试集。由于我们希望允许存在不同的实现,因此我们希望这组测试是 (a) 通用的,以便我们可以重新使用它来测试不同的实现,并且 (b) 尽可能完整。对于 (b) 部分,我想知道是否有任何用于测试枚举类型的最佳实践。因此,例如我有一个枚举如下:

 public enum Month {
    January,
    February,
    ...
    December;
}

这里我要确保所有枚举类型都真实存在。那有必要吗?目前我正在使用 Hamcrests assertThat 如以下示例所示:

 assertThat(Month.January, is(notNullValue()));

缺少“January”枚举会导致编译时错误,可以通过创建缺少的枚举类型来修复该错误。

我在这里使用的是 Java,但我不介意您的答案是否适用于其他语言。

编辑:

正如 mkato 和 Mark Heath 都指出的那样,可能没有必要测试枚举,因为当您使用不存在的枚举类型时,编译器将无法编译。但我仍然想测试这些枚举,因为我们想构建一个单独的类似 TCK 的 test.jar,它将在不同的实现上运行相同的测试。所以我的问题更像是:测试枚举类型的最佳方法是什么?

仔细考虑之后,我将上面的 Hamcrest 语句更改为:

 assertThat(Month.valueOf("January"), is(notNullValue()));

当 1 月(还)不存在时,该声明现在会抛出 NPE。这种方法有什么问题吗?

原文由 seb 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 763
2 个回答

对于枚举,我只在它们确实有方法时才测试它们。如果它像您的示例一样是纯值枚举,我会说不要打扰。

但是由于您热衷于测试它,因此选择第二个选项比第一个要好得多。第一个问题是,如果您使用 IDE,对枚举的任何重命名也会重命名您的测试类中的枚举。

原文由 aberrant80 发布,翻译遵循 CC BY-SA 2.5 许可协议

我同意 aberrant80 的观点。

对于枚举,我只在它们确实有方法时才测试它们。如果它像您的示例一样是纯值枚举,我会说不要打扰。

但是由于您热衷于测试它,因此选择第二个选项比第一个要好得多。第一个问题是,如果您使用 IDE,对枚举的任何重命名也会重命名您的测试类中的枚举。

我会通过添加单元测试 Enum 非常有用来扩展它。如果您在大型代码库中工作,构建时间开始增加,单元测试可能是验证功能的更快方法(测试仅构建它们的依赖项)。另一个非常大的优势是其他开发人员不能无意中更改您代码的功能(对于非常大的团队来说这是一个巨大的问题)。

对于所有测试驱动开发,围绕枚举方法的测试可以减少代码库中的错误数量。

简单例子

public enum Multiplier {
    DOUBLE(2.0),
    TRIPLE(3.0);

    private final double multiplier;

    Multiplier(double multiplier) {
        this.multiplier = multiplier;
    }

    Double applyMultiplier(Double value) {
        return multiplier * value;
    }

}

public class MultiplierTest {

    @Test
    public void should() {
        assertThat(Multiplier.DOUBLE.applyMultiplier(1.0), is(2.0));
        assertThat(Multiplier.TRIPLE.applyMultiplier(1.0), is(3.0));
    }
}

原文由 Mike Rylander 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题