Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将TestNG@DataProvider迁移到JUnit Jupiter@ParameterizedTest_Testng_Junit5_Testng Dataprovider_Junit Jupiter - Fatal编程技术网

如何将TestNG@DataProvider迁移到JUnit Jupiter@ParameterizedTest

如何将TestNG@DataProvider迁移到JUnit Jupiter@ParameterizedTest,testng,junit5,testng-dataprovider,junit-jupiter,Testng,Junit5,Testng Dataprovider,Junit Jupiter,我尝试将使用TestNG的单元测试迁移到JUnit Jupiter(JUnit 5),我想知道哪种方法是最好的: TestNG: @DataProvider 公共对象[][]无效端口号(){ 返回新对象[][]{ {--http“,”}, {--http“,“-42”}, {--http,“0”}, {--http”,“非端口号”}, {--https,“67000”} }; } @测试(dataProvider=“invalidPortNumbers”, expectedExceptions=

我尝试将使用TestNG的单元测试迁移到JUnit Jupiter(JUnit 5),我想知道哪种方法是最好的:

TestNG

@DataProvider
公共对象[][]无效端口号(){
返回新对象[][]{
{--http“,”},
{--http“,“-42”},
{--http,“0”},
{--http”,“非端口号”},
{--https,“67000”}
};
}
@测试(dataProvider=“invalidPortNumbers”,
expectedExceptions=ParameterException.class,
expectedExceptionsMessageRegExp=“.*不是有效的端口号。*”)
public void shouldtoValidatePortNumber(最终字符串…args){
新的命令行分析器(args);
}
我看到移动到JUnit Jupiter,我可以做到:

静态流invalidPortNumbers2(){
回流(
((对象)新字符串[]{--http“,“-42”})的参数,
((对象)新字符串[]{--http”,“0”})的参数,
((Object)新字符串[]{--http”,“not_a_port_number”})的参数,
((对象)新字符串[]{--https”,“67000”})的参数
);
}
@参数化测试
@方法源(“invalidPortNumbers2”)
void shouldFaildValidatePortNumber(最终字符串…args){
assertThatThrownBy(()->新命令行分析器(args))
.isInstanceOf(ParameterException.class)
.hasMessageMatching(“.*不是有效的端口号。*”);
}
是否有其他方法可以简化此过程并保留以前的数据提供程序结构以最小化更改


谢谢。

对于JUnit Jupiter中的参数化测试,如果通过
@MethodSource
引用的方法的返回类型是二维数组,则内部数组的值将作为多个参数传递给单个测试方法调用。这意味着没有直接的方法可以将接受var args(或显式数组)的测试方法从TestNG的
@DataProvider
迁移到JUnit Jupiter的
@MethodSource

您的
invalidPortNumbers2()
是解决此限制的合适方法,但您可能更喜欢其他方法


更新答案:

将所有参数作为单个数组处理的最简单方法是通过
ArgumentsAccessor
API

如果将现有的
invalidPortNumbers()
方法
设置为静态的
,则可以按“原样”使用,并将参数转换为数组,如下所示

@ParameterizedTest
@MethodSource(“InvalidPortNumber”)
void shouldFaildValidatePortNumber(参数访问器){
对象[]args=accessor.toArray();
//使用参数。。。
}
不过,在JUnit Jupiter中,您可能会发现对于此类用例,使用
@CsvSource
比使用
@MethodSource
更可取。因此,为了实现相同的目标,您可以按如下所示重写测试,并去掉
invalidPortNumbers()
方法

@ParameterizedTest
@CSV源({
“--http,”,
“--http,-42”,
“--http,0”,
“--http,不是端口号”,
--https,67000
})
void shouldFaildValidatePortNumber(参数访问器){
对象[]args=accessor.toArray();
//使用参数。。。
}

原始答案:

对于初学者,以下实用程序方法将有助于简化事情(在名为
varargsparamests
的类中声明,但可以移动到公共实用程序类中)。请注意,
arguments()
是通过
org.junit.jupiter.params.provider.arguments.arguments
静态导入的

静态参数arrayArguments(字符串…数组){
返回参数((对象)数组);
}
有鉴于此,如果您希望保留现有的
invalidPortNumbers()
方法,而只需进行尽可能少的修改,那么您可以将其签名重新定义为
静态字符串[][]invalidPortNumbers()
,并引入实际从
@MethodSource
引用的以下方法

静态流invalidPortNumbersArguments(){
返回Arrays.stream(invalidPortNumbers()).map(varargsparamests::arrayArguments);
}
如果您想进一步修改现有的
invalidPortNumbers()
方法,可以将其更改为以下同样使用
arrayArguments()
实用程序方法的方法

静态流invalidPortNumbers(){
回流(
arrayArguments(“--http”,”),
arrayArguments(“--http”,“-42”),
arrayArguments(“--http”,“0”),
arrayArguments(“--http”,“非端口号”),
数组格式(“--https”,“67000”)
);
}

如果将现有的
invalidPortNumbers()设置为
method
static
并从
@MethodSource
引用它?我得到了以下异常:
org.junit.jupiter.api.extension.ParameterResolutionException:在索引0处转换参数时出错:没有隐式转换将java.lang.String类型的对象转换为类型[Ljava.lang.String;
请注意,我使用ArgumentsAccessor API添加了解决方案。非常感谢