0

我目前正在编写与 GET 请求相关的单元测试,下面是一个采用通用类型 E 的参数化测试。

abstract class AbstractEntityTest< E extends Entity > {

@ParameterizedTest( name = "[{index}]: {2}" )
@MethodSource( "RoleDataProvider#provideIntArgsToTest" )
void testIntRequestsThatReturnSingle( String fileName, Integer requestParam, String testName, int index )
         // do something
    }
}

我想要做的是在运行时根据 E 的实际类型动态更改方法源。

例子:

public class AnimalTest extends AbstractEntityTest< Animal > {
... }

这里 E 是 Animal 类型,所以我想将 @MethodSource 更改为

@MethodSource( "AnimalDataProvider#provideIntArgsToTest" )

有什么办法吗?我一直在寻找几个小时无济于事...

4

1 回答 1

1

恐怕这在 Java 中是不可能的。Java 是一种强静态类型语言,这意味着对象不能更改其类型,并且在编译期间会进行类型检查。

Java 使用擦除实现泛型,这意味着编译器会将您的绑定类型参数替换E为边界类Entity在此处描述)。

你想达到什么目的?如果您想避免重复,您可以将共享逻辑分组到一个方法中并调用它@BeforeEach

编辑:明白了,我想我知道你的意思,为回应欢呼。您是否尝试过在儿童测试课程中指定这一点?

我尝试使用相同的概念,但使用Number,IntegerDouble. 这是我得到的: AbstractTest.java

public abstract class AbstractTest<E extends Number> {

    void testIntRequestsThatReturnSingle(Number i){
        System.out.println(i);
        //doing the same stuff here but with the different data sources
    }

    public static IntStream intProvider() {
        return IntStream.range(0, 10);
    }

    public static DoubleStream doubleProvider() {
        return DoubleStream.of(0.0,1.1,2.2);
    }
}

一童IntTest.java班:

public class IntTest extends AbstractTest<Integer>{
    @ParameterizedTest
    @MethodSource( "intProvider" )
    public void intTest(Number i){
        this.testIntRequestsThatReturnSingle(i);
    }
}

另一个子DoubleTest.java类:

public class DoubleTest extends AbstractTest<Integer>{
    @ParameterizedTest
    @MethodSource( "doubleProvider" )
    public void doubleTest(Number i){
        this.testIntRequestsThatReturnSingle(i);
    }
}

通过这种方式,您可以最大限度地减少重复并确保为正确的类调用正确的方法(没有任何可怕的强制转换)。这是否符合您的要求?

于 2022-02-03T17:49:57.113 回答