gpt4 book ai didi

java - 比较枚举时简化测试

转载 作者:行者123 更新时间:2023-12-04 11:02:16 24 4
gpt4 key购买 nike

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

@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);
}

但是(当然)这个例子甚至不能编译。

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

最佳答案

您可以使用 getEnumConstants像这样:

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
}
}

作为 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
}
}

关于java - 比较枚举时简化测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58730373/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com