使用DataProvider传递lambda作为testng参数?

问题描述 投票:1回答:2

我想知道是否有办法从testng的数据提供者传递lambda。因此,我想执行以下操作:

    @DataProvider(name="checkProvider")
    public Object[][] checkProvider() {
        return new Object[][]{
            "Some string to test", (String string) -> string.length() > 2 //A predicate on how to test response
        }
    }

然后进行像这样的测试

@Test(dataProvider="checkProvider")
public void testsomething(String s, Predicate<String> checker) {
    //so some operation on s to get a string I want to check
    Assert.assertTrue(checker.check(someString));
}

现在我无法执行此操作,因为lambda转换的目标类型必须是接口。是否有人对如何执行此操作有任何想法,甚至可以选择一种替代方法,这样我就可以实现所需的功能。

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

java testing java-stream testng testng-dataprovider
2个回答
1
投票

因此,在现实世界中,我通常使用带有函数接口的lambda表达式对从excel工作表获取的数据执行一些操作。您可能知道有时为了提供默认值,您的excelsheet在某列中没有值可能会发生。有时我们使用这个。当前,我已经创建了一个简单的示例,其中它是从列表中检索数据。列表中存储的数据包含我们不需要的空格。因此,为了达到相同目的,我使用了功能接口。

功能接口

package testng.package1;


@FunctionalInterface
public interface Trimmer {

    String getTrimmedString(String value);

}

TestClass

package testng.package1;

import java.util.ArrayList;
import java.util.List;

import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class TestClass
{


    List<String> dataList = new ArrayList<>();
    {
        dataList.add("Tomato");
        dataList.add(" Cucumber");
        dataList.add("Onion ");
        dataList.add(" Vegetable that you like ");
    }

    public String trim(String data)
    {
        Trimmer trim = (value) -> { return value.trim(); };

        return trim.getTrimmedString(data);
    }


    @DataProvider(name = "data")
    public Object[][] getData()
    {
        Object[][] data = { {"veg1", trim(dataList.get(0))}, {"veg2", trim(dataList.get(1))}, {"veg3", trim(dataList.get(2))}, {"veg4", trim(dataList.get(3))}, };

        return data;
    }


    @Test( dataProvider = "data" )
    public void test(String vegId, String vegVal)
    {
        System.out.println("Vegetable ID: " + vegId + " : " + "Vegetable Name: " + vegVal);
    }

}

输出

[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
===============================================

0
投票

根据要求,我的评论为答案:

您可以做:

Predicate<String> p = string -> string.length() > 2; 
public Object[][] dataProviderMethod() { 
    return new Object[][] { { "Some string to test" }, { p } }; 
} 

我不知道TestNG有什么用。

© www.soinside.com 2019 - 2024. All rights reserved.