Java 使用DataProvider将lambdas作为testng参数传递?

Java 使用DataProvider将lambdas作为testng参数传递?,java,testing,java-stream,testng,testng-dataprovider,Java,Testing,Java Stream,Testng,Testng Dataprovider,我想知道是否有一种方法可以从testng的数据提供者那里传递lambda。所以我想做如下的事情: @DataProvider(name=“checkProvider”) 公共对象[][]检查提供程序(){ 返回新对象[][]{ “要测试的某个字符串”,(string string)->string.length()>2//关于如何测试响应的谓词 } } 在那之后,进行一些类似的测试 @Test(dataProvider=“checkProvider”) 公共void testsomething

我想知道是否有一种方法可以从testng的数据提供者那里传递lambda。所以我想做如下的事情:

@DataProvider(name=“checkProvider”)
公共对象[][]检查提供程序(){
返回新对象[][]{
“要测试的某个字符串”,(string string)->string.length()>2//关于如何测试响应的谓词
}
}
在那之后,进行一些类似的测试

@Test(dataProvider=“checkProvider”)
公共void testsomething(字符串s、谓词检查器){
//对s进行一些操作,得到一个我想要检查的字符串
Assert.assertTrue(checker.check(someString));
}
现在我不能这样做,因为我得到的lambda转换的目标类型必须是一个接口。 有没有人对如何做到这一点有什么想法,或者哪怕是一个替代方案都很好,这样我就可以实现所需的功能


编辑:答案在第一条评论中。我试图直接传递lambda,但如果先声明它,然后在对象[]中传递它,那么它就可以正常工作。

因此在现实场景中,我通常使用带有函数接口的lambda表达式对从excel工作表中获取的数据执行一些操作。您可能知道,有时您的Excel工作表可能在列中没有值,以便提供默认值。有时候我们用这个。目前,我创建了一个简单的示例,其中它从列表中检索数据。存储在列表中的数据包含我们不需要的空白。所以为了实现同样的功能,我使用了功能接口

功能接口:

测试类:


所以在现实场景中,我通常使用带有函数接口的lambda表达式对从excel工作表中获取的数据执行一些操作。您可能知道,有时您的Excel工作表可能在列中没有值,以便提供默认值。有时候我们用这个。目前,我创建了一个简单的示例,其中它从列表中检索数据。存储在列表中的数据包含我们不需要的空白。所以为了实现同样的功能,我使用了功能接口

功能接口:

测试类:


应要求,以下是我的评论作为答复:

你可以做:

Predicate<String> p = string -> string.length() > 2; 
public Object[][] dataProviderMethod() { 
    return new Object[][] { { "Some string to test" }, { p } }; 
} 
谓词p=string->string.length()>2;
公共对象[][]dataProviderMethod(){
返回新对象[][{“要测试的字符串”},{p};
} 

我不知道它对TestNG有多有用。

根据要求,以下是我的评论作为回答:

你可以做:

Predicate<String> p = string -> string.length() > 2; 
public Object[][] dataProviderMethod() { 
    return new Object[][] { { "Some string to test" }, { p } }; 
} 
谓词p=string->string.length()>2;
公共对象[][]dataProviderMethod(){
返回新对象[][{“要测试的字符串”},{p};
} 

我不知道它对TestNG有多有用。

您只需要强制转换数组元素就可以了

public Object[][]dataProviderMethod(){
返回新对象[][{{(函数)(string->string.length()>2)};
} 

您只需强制转换数组元素即可运行

public Object[][]dataProviderMethod(){
返回新对象[][{{(函数)(string->string.length()>2)};
} 

您可以执行:
谓词p=string->string.length()>2;公共对象[][]dataProviderMethod(){返回新对象[][{{“要测试的字符串”},{p};}
我不知道它对TestNG有多有用请回答这个问题。非常感谢。你可以做:
Predicate p=string->string.length()>2;公共对象[][]dataProviderMethod(){返回新对象[][{{“要测试的字符串”},{p};}
我不知道它对TestNG有多有用请回答这个问题。非常感谢。感谢链接,但我知道lambda表达式,我想知道是否有一些方法可以参数化testng测试以使用lambdas。非常抱歉。当然,我正在为您创建一个带有一些实时场景的项目,多亏了冠状病毒锁定,我有空闲时间来做:)感谢您的努力,但我没有预先应用谓词的值。在我编写的测试中,我将从REST调用中获取值,只有这样我才能应用谓词。感谢链接,但我知道lambda表达式,我想知道是否有某种方法可以参数化testng测试以使用lambdas。非常抱歉。当然,我正在为您创建一个带有一些实时场景的项目,多亏了冠状病毒锁定,我有空闲时间来做:)感谢您的努力,但我没有预先应用谓词的值。在我正在编写的测试中,我将从REST调用中获取值,只有这样,我才能应用谓词。
[RemoteTestNG] detected TestNG version 7.0.1
Vegetable ID: veg1 : Vegetable Name: Tomato
Vegetable ID: veg2 : Vegetable Name: Cucumber
Vegetable ID: veg3 : Vegetable Name: Onion
Vegetable ID: veg4 : Vegetable Name: Vegetable that you like
PASSED: test("veg1", "Tomato")
PASSED: test("veg2", "Cucumber")
PASSED: test("veg3", "Onion")
PASSED: test("veg4", "Vegetable that you like")

===============================================
    Default test
    Tests run: 4, Failures: 0, Skips: 0
===============================================
Predicate<String> p = string -> string.length() > 2; 
public Object[][] dataProviderMethod() { 
    return new Object[][] { { "Some string to test" }, { p } }; 
} 
public Object[][] dataProviderMethod() { 
    return new Object[][] {{ (Function<String, Boolean>) (string -> string.length() > 2) }}; 
}