从 @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 中指定?
我尝试使用相同的概念,但使用 Number
、Integer
和 Double
。这是我得到的:
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.java
class:
public class IntTest extends AbstractTest<Integer>{
@ParameterizedTest
@MethodSource( "intProvider" )
public void intTest(Number i){
this.testIntRequestsThatReturnSingle(i);
}
}
另一个childDoubleTest.java
class:
public class DoubleTest extends AbstractTest<Integer>{
@ParameterizedTest
@MethodSource( "doubleProvider" )
public void doubleTest(Number i){
this.testIntRequestsThatReturnSingle(i);
}
}
通过这种方式,您可以最大限度地减少重复并确保为正确的 classes 调用正确的方法(没有任何可怕的转换)。这是否符合您要查找的内容?
我目前正在编写与 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 中指定?
我尝试使用相同的概念,但使用 Number
、Integer
和 Double
。这是我得到的:
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.java
class:
public class IntTest extends AbstractTest<Integer>{
@ParameterizedTest
@MethodSource( "intProvider" )
public void intTest(Number i){
this.testIntRequestsThatReturnSingle(i);
}
}
另一个childDoubleTest.java
class:
public class DoubleTest extends AbstractTest<Integer>{
@ParameterizedTest
@MethodSource( "doubleProvider" )
public void doubleTest(Number i){
this.testIntRequestsThatReturnSingle(i);
}
}
通过这种方式,您可以最大限度地减少重复并确保为正确的 classes 调用正确的方法(没有任何可怕的转换)。这是否符合您要查找的内容?