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的示例。