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

Junit 测试实现标记接口的所有枚举,junit,enums,kotlin,kotlintest,Junit,Enums,Kotlin,Kotlintest,我有空接口接口HavingUniqueValues(val v:Int){}和一些枚举,如枚举类EnumName(override val v:Int):HavingUniqueValues 我希望每个枚举中的元素都有唯一的v-值,但我可能会键入错误的值。所以我需要一个测试 是否可以创建一个测试,其中接口实现被手动保存为列表,测试将检查列表中的所有实现是否满足要求 如果是:是否可以创建一个函数,返回指定包中所有实现的列表,以便在测试中使用 看看图书馆吧,它可能会对你有所帮助 您应该能够获取所有具

我有空接口
接口HavingUniqueValues(val v:Int){}
和一些枚举,如
枚举类EnumName(override val v:Int):HavingUniqueValues

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

  • 是否可以创建一个测试,其中接口实现被手动保存为
    列表
    ,测试将检查
    列表
    中的所有实现是否满足要求
  • 如果是:是否可以创建一个函数,返回指定包中所有实现的
    列表
    ,以便在测试中使用
  • 看看图书馆吧,它可能会对你有所帮助

    您应该能够获取所有具有InguniqueValues的
    子类型

    val subjects: Set<Class<out HavingUniqueValues>> =
            Reflections("your.package").getSubTypesOf(HavingUniqueValues::class.java)
    
    我在这里使用了
    toSet()
    来删除所有非Inque值

    这将通过测试:

    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) }
    
    这将无法通过测试:

    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) }
    
    看看图书馆吧,它可能会对你有所帮助

    您应该能够获取所有具有InguniqueValues的
    子类型

    val subjects: Set<Class<out HavingUniqueValues>> =
            Reflections("your.package").getSubTypesOf(HavingUniqueValues::class.java)
    
    我在这里使用了
    toSet()
    来删除所有非Inque值

    这将通过测试:

    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) }
    
    这将无法通过测试:

    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的优秀答案变成了一个复制粘贴片段

    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
        }
      }
    
    })
    
    classmytest:StringSpec({
    “唯一值”{
    val主题:Set=
    反射(“your.package”).getSubsubsoft(HavingUniqueValues::class.java)
    subjects.forEach{enumClass->
    enumClass.enumConstants.size应为
    enumClass.enumConstants.map(HavingUniqueValues::v).toSet().size
    }
    }
    })
    
    自从你用
    kotlintest
    标记你的问题以来,我已经把@egor的优秀答案变成了一个复制粘贴片段

    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
        }
      }
    
    })
    
    classmytest:StringSpec({
    “唯一值”{
    val主题:Set=
    反射(“your.package”).getSubsubsoft(HavingUniqueValues::class.java)
    subjects.forEach{enumClass->
    enumClass.enumConstants.size应为
    enumClass.enumConstants.map(HavingUniqueValues::v).toSet().size
    }
    }
    })
    
    我尝试了接受的解决方案,但它对枚举无效。Reflectons库似乎不支持搜索自定义枚举、异常等实现,至少在上面的回答中提供了默认配置。有很多链接和文档可以回答为什么它不起作用:

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

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

    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"
    }
    
    try(ScanResult ScanResult=new ClassGraph().enableAllInfo().whitelistPackages(“package.with.your.enums”).scan()){
    ClassInfo列表实现SREFS=scanResult.getClassesImplementing(“package.with.your.enums.yourInterfaceForEnums”);
    
    List我尝试了可接受的解决方案,但该解决方案不适用于枚举。Reflectons library似乎不支持搜索自定义枚举、异常等实现。至少在上面的回答中提供了默认配置。有很多链接和文档回答了它不起作用的原因:

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

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

    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"
    }
    
    try(ScanResult ScanResult=new ClassGraph().enableAllInfo().whitelistPackages(“package.with.your.enums”).scan()){
    ClassInfo列表实现SREFS=scanResult.getClassesImplementing(“package.with.your.enums.yourInterfaceForEnums”);
    列表