测试实现标记接口的所有枚举



我有空的接口interface HavingUniqueValues(val v: Int) {}和一些像enum class EnumName(override val v: Int) : HavingUniqueValues这样的枚举。

我希望每个枚举中的元素具有唯一的v值,但我可能会错误地键入值。所以我需要一个测试。

  1. 是否可以创建一个测试,其中接口实现手动保存为List,并且测试检查List中的所有实现是否满足要求?
  2. 如果是:是否可以创建一个函数,该函数返回指定包中所有实现的List以在测试中使用它?

看看 Reflections 库,它可能会帮助你解决这个问题。

您应该能够获得HavingUniqueValues的所有子类型:

val subjects: Set<Class<out HavingUniqueValues>> =
Reflections("your.package").getSubTypesOf(HavingUniqueValues::class.java)

现在,这将产生一组实现HavingUniqueValues的所有枚举类。您可以迭代它们的所有值以了解它们是否唯一:

subjects.forEach { enumClass ->
assertEquals(
enumClass.enumConstants.size,
enumClass.enumConstants.map(HavingUniqueValues::v).toSet().size
)
}

我在这里使用toSet()来删除所有非inuque值。

这将通过测试:

enum class EnumName(override val v: Int) : HavingUniqueValues { ONE(1), TWO(2), THREE(3) }

这不会通过测试:

enum class EnumName(override val v: Int) : HavingUniqueValues { ONE(1), TWO(2), THREE(2) }

我尝试了可接受的解决方案,但它不适用于枚举。似乎 Reflectons 库不支持搜索自定义枚举、异常等实现。至少使用上述答案中提供的默认配置。有很多链接和文档可以回答为什么它不起作用:

为什么 reflections.getSubTypesOf(Object.class( 找不到枚举?

https://github.com/ronmamo/reflections/issues/126

我能够使用类图找到并测试类似的解决方案

以下是对我使用枚举的示例代码:

try (ScanResult scanResult = new ClassGraph().enableAllInfo().whitelistPackages("package.with.your.enums").scan()) {
ClassInfoList implementationsRefs = scanResult.getClassesImplementing("package.with.your.enums.yourInterfaceForEnums");
List<Class<?>> implementations = implementationsRefs.loadClasses();
//here goes your code that operates on "implementations"
}

自从你用kotlintest标记你的问题以来,我已经把@egor的优秀答案变成了 KotlinTest 复制 n 粘贴片段。

class MyTest : StringSpec({
"unique values" {
val subjects: Set<Class<out HavingUniqueValues>> =
Reflections("your.package").getSubTypesOf(HavingUniqueValues::class.java)
subjects.forEach { enumClass ->
enumClass.enumConstants.size shouldBe
enumClass.enumConstants.map(HavingUniqueValues::v).toSet().size
}
}
})

最新更新