测试所有实现标记接口的枚举
Test all enums implementing the marker interface
我有空接口 interface HavingUniqueValues(val v: Int) {}
和一些枚举,例如 enum class EnumName(override val v: Int) : HavingUniqueValues
。
我希望每个枚举中的元素都具有唯一的 v
值,但我可能会输入错误的值。所以我需要测试一下。
- 是否可以创建一个测试,将接口实现手动保存为
List
,并检查 List
中的所有实现是否满足要求?
- 如果是:是否可以创建一个 returns 指定包中所有实现的
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()
删除所有非唯一值。
这将通过测试:
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) }
自从您用 kotlintest
标记了您的问题后,我已将 @egor 的出色回答变成了 KotlinTest 复制粘贴代码段供您使用。
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
}
}
})
我尝试了公认的解决方案,但它不适用于枚举。 Reflectons 库似乎不支持搜索自定义枚举、异常等实现。至少在上述答案中提供了默认配置。有很多链接和文档可以回答为什么它不起作用:
https://github.com/ronmamo/reflections/issues/126
我能够找到并测试与 Classgraph
类似的解决方案
这是对我适用的枚举示例代码:
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"
}
我有空接口 interface HavingUniqueValues(val v: Int) {}
和一些枚举,例如 enum class EnumName(override val v: Int) : HavingUniqueValues
。
我希望每个枚举中的元素都具有唯一的 v
值,但我可能会输入错误的值。所以我需要测试一下。
- 是否可以创建一个测试,将接口实现手动保存为
List
,并检查List
中的所有实现是否满足要求? - 如果是:是否可以创建一个 returns 指定包中所有实现的
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()
删除所有非唯一值。
这将通过测试:
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) }
自从您用 kotlintest
标记了您的问题后,我已将 @egor 的出色回答变成了 KotlinTest 复制粘贴代码段供您使用。
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
}
}
})
我尝试了公认的解决方案,但它不适用于枚举。 Reflectons 库似乎不支持搜索自定义枚举、异常等实现。至少在上述答案中提供了默认配置。有很多链接和文档可以回答为什么它不起作用:
https://github.com/ronmamo/reflections/issues/126
我能够找到并测试与 Classgraph
类似的解决方案这是对我适用的枚举示例代码:
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"
}