从 @ParameterizedTest (Jupiter-Junit 5) 动态更改抽象 class 中的 @MethodSource

Dynamically changing @MethodSource in abstract class from a @ParameterizedTest (Jupiter-Junit 5)

我目前正在编写与 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" )

有什么办法吗?我已经搜索了几个小时都无济于事...

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

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

你想达到什么目的?如果你想避免重复,你可以将共享逻辑分组到一个方法中,并将其命名为 @BeforeEach 例如。

编辑:明白了,我想我明白你的意思,为回应干杯。您是否尝试过在 children 测试 classes 中指定?

我尝试使用相同的概念,但使用 NumberIntegerDouble。这是我得到的: 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);
    }
}

一个childIntTest.javaclass:

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

另一个childDoubleTest.javaclass:

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

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