Java 在比较枚举时简化测试

Java 在比较枚举时简化测试,java,enums,refactoring,simplify,Java,Enums,Refactoring,Simplify,我有一些测试代码,看起来像: @Test public void testEnums_AB() { // arrange + act var enums_1 = Arrays.stream(enumsA.values()).map(Enum::name).collect(Collectors.toSet()); var enums_2 = Arrays.stream(enumsB.values()).map(Enum::name).collect(Collectors

我有一些测试代码,看起来像:

@Test
  public void testEnums_AB() {
    // arrange + act
    var enums_1 = Arrays.stream(enumsA.values()).map(Enum::name).collect(Collectors.toSet());
    var enums_2 = Arrays.stream(enumsB.values()).map(Enum::name).collect(Collectors.toSet());

    // assert
    Assertions.assertEquals(enums_1, enums_2);
  }

  @Test
  public void testEnums_CD() {
    // arrange + act
    var enums_3 = Arrays.stream(enumsC.values()).map(Enum::name).collect(Collectors.toSet());
    var enums_4 = Arrays.stream(enumsD.values()).map(Enum::name).collect(Collectors.toSet());

    // assert
    Assertions.assertEquals(enums_3, enums_4);
  }
。。。等等

我正在考虑如何简化模式,使逻辑只存在一次,例如:

@ParameterizedTest(name = "{index} => enum1={0},enum2={1}")
  @MethodSource("parametersProvider")
  public void testEnum(enum enum1, enum enum2) {
    // arrange + act
    var enumsBlah = Arrays.stream(enum1.values()).map(Enum::name).collect(Collectors.toSet());
    var enumsFoo = Arrays.stream(enum2.values()).map(Enum::name).collect(Collectors.toSet());

    // assert
    Assertions.assertEquals(enumsBlah, enumsFoo);
  }
但是(当然)这个例子甚至不可编译

有没有人有办法避免这些枚举检查的重复结构

var enums_1 = Arrays.stream(enumsA.values()).map(Enum::name).collect(Collectors.toSet());
应该使用一种方法。假设您有一个名为
testifyEnum
的方法,该方法将获取
enum
参数并计算赋值的右侧,您只需执行以下操作:

var enums_1 = testifyEnum(enumsA);
因此,您的代码将如下所示:

@Test
  public void testEnums_AB() {
    // arrange + act
    var enums_1 = testifyEnum(enumsA);
    var enums_2 = testifyEnum(enumsB);

    // assert
    Assertions.assertEquals(enums_1, enums_2);
  }

  @Test
  public void testEnums_CD() {
    // arrange + act
    var enums_3 = testifyEnum(enumsC);
    var enums_4 = testifyEnum(enumsD);

    // assert
    Assertions.assertEquals(enums_3, enums_4);
  }
import java.util.Arrays;
import java.util.stream.Collectors;

public class Test {
    public static void main(String[] args) {
        testEnum(TestEnum.class, AnotherTestEnum.class);
    }

    private static <T extends Enum<T>, T2 extends Enum<T2>> void testEnum(Class<T> enums1Class, Class<T2> enums2Class) {
        var enums1 = Arrays.stream(enums1Class.getEnumConstants()).map(Enum::name).collect(Collectors.toSet());
        var enums2 = Arrays.stream(enums2Class.getEnumConstants()).map(Enum::name).collect(Collectors.toSet());

        // compare here
    }

    private enum TestEnum {
        A, B
    }

    private enum AnotherTestEnum {
        A, B
    }
}

您可以像这样使用
getEnumConstants

@Test
  public void testEnums_AB() {
    // arrange + act
    var enums_1 = testifyEnum(enumsA);
    var enums_2 = testifyEnum(enumsB);

    // assert
    Assertions.assertEquals(enums_1, enums_2);
  }

  @Test
  public void testEnums_CD() {
    // arrange + act
    var enums_3 = testifyEnum(enumsC);
    var enums_4 = testifyEnum(enumsD);

    // assert
    Assertions.assertEquals(enums_3, enums_4);
  }
import java.util.Arrays;
import java.util.stream.Collectors;

public class Test {
    public static void main(String[] args) {
        testEnum(TestEnum.class, AnotherTestEnum.class);
    }

    private static <T extends Enum<T>, T2 extends Enum<T2>> void testEnum(Class<T> enums1Class, Class<T2> enums2Class) {
        var enums1 = Arrays.stream(enums1Class.getEnumConstants()).map(Enum::name).collect(Collectors.toSet());
        var enums2 = Arrays.stream(enums2Class.getEnumConstants()).map(Enum::name).collect(Collectors.toSet());

        // compare here
    }

    private enum TestEnum {
        A, B
    }

    private enum AnotherTestEnum {
        A, B
    }
}
导入java.util.array;
导入java.util.stream.collector;
公开课考试{
公共静态void main(字符串[]args){
testEnum(testEnum.class,另一个testEnum.class);
}
私有静态void testEnum(类enums1Class、类enums2Class){
var enums1=Arrays.stream(enums1Class.getEnumConstants()).map(Enum::name).collect(Collectors.toSet());
var enums2=Arrays.stream(enums2Class.getenumcontents()).map(Enum::name).collect(Collectors.toSet());
//在这里比较
}
私有枚举TestEnum{
A、 B
}
私有枚举AnotherTestEnum{
A、 B
}
}
作为JUnit 5测试:

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;

import java.util.Arrays;
import java.util.stream.Collectors;

class EnumTest {
    private static Object[][] parametersProvider() {
        return new Object[][]{
                {TestEnum.class, AnotherTestEnum.class}
        };
    }

    @ParameterizedTest(name = "{index} => enum1={0}, enum2={1}")
    @MethodSource("parametersProvider")
    <T extends Enum<T>, T2 extends Enum<T2>> void testEnum(Class<T> enums1Class, Class<T2> enums2Class) {
        var enums1 = Arrays.stream(enums1Class.getEnumConstants()).map(Enum::name).collect(Collectors.toSet());
        var enums2 = Arrays.stream(enums2Class.getEnumConstants()).map(Enum::name).collect(Collectors.toSet());

        Assertions.assertEquals(enums1, enums2);
    }

    private enum TestEnum {
        A, B
    }

    private enum AnotherTestEnum {
        A, B
    }
}
import org.junit.jupiter.api.Assertions;
导入org.junit.jupiter.params.ParameterizeTest;
导入org.junit.jupiter.params.provider.MethodSource;
导入java.util.array;
导入java.util.stream.collector;
类枚举测试{
私有静态对象[][]参数Provider(){
返回新对象[][]{
{TestEnum.class,另一个TestEnum.class}
};
}
@ParameterizeTest(name=“{index}=>enum1={0},enum2={1}”)
@方法源(“参数提供者”)
void testEnum(类enums1Class、类enums2Class){
var enums1=Arrays.stream(enums1Class.getEnumConstants()).map(Enum::name).collect(Collectors.toSet());
var enums2=Arrays.stream(enums2Class.getenumcontents()).map(Enum::name).collect(Collectors.toSet());
assertEquals(enums1、enums2);
}
私有枚举TestEnum{
A、 B
}
私有枚举AnotherTestEnum{
A、 B
}
}

用另一个方法提取这两行并调用它。@GauravJeswani那么你知道如何提取方法参数列表中的特定枚举吗?@DerBenniAusA我已经给出了答案。我想这正是您所期望的。看起来很不错,我将尝试添加一个基于JUnit5的示例。