簡體   English   中英

使用 DataProvider 將 lambdas 作為 testng 參數傳遞?

[英]Passing lambdas as testng parameters using DataProvider?

我想知道是否有辦法從 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));
}

現在我無法執行此操作,因為我得到Target type of lambda conversion must be an interface 有沒有人知道如何做到這一點,甚至替代方案會很好,這樣我就可以實現所需的功能。

編輯:答案在第一條評論中。 我試圖直接傳遞 lambda 但是如果你先聲明它然后在 Object[][] 中傳遞它,那么它工作正常。

所以在現實世界的場景中,我通常使用帶有函數接口的 lambda 表達式對我們從 excel 表中獲取的數據執行一些操作。 您可能知道,有時您的 excelsheet 可能會在列中沒有值,然后才能提供默認值。 有時我們使用它。 目前我已經創建了一個簡單的例子,它從列表中檢索數據。 存儲在列表中的數據包含我們不想要的空格。 所以為了達到同樣的效果,我使用了功能接口。

功能接口

package testng.package1;


@FunctionalInterface
public interface Trimmer {

    String getTrimmedString(String value);

}

測試類

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);
    }

}

Output

[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 } }; 
} 

我不知道它對 TestNG 有多大用處。

您只需要將數組元素轉換為 Function<String, Boolean>

public Object[][] dataProviderMethod() { 
    return new Object[][] {{ (Function<String, Boolean>) (string -> string.length() > 2) }}; 
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM