1

我有空界面interface HavingUniqueValues(val v: Int) {}和一些枚举,例如enum class EnumName(override val v: Int) : HavingUniqueValues.

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

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

3 回答 3

3

看看可能对您有所帮助的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) }
于 2018-07-08T18:34:55.680 回答
2

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

为什么反射.getSubTypesOf(Object.class) 找不到枚举?

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"
}
于 2019-07-30T18:53:37.973 回答
1

既然您用 标记了您的问题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
    }
  }

})
于 2018-07-15T07:51:17.557 回答