gpt4 book ai didi

java - 使用@Factory TestNG时将参数传递给dataProvide

转载 作者:行者123 更新时间:2023-12-02 02:53:18 26 4
gpt4 key购买 nike

有一个异常(exception),使用 TestNG 的 @Factory 和 @dataProvider 注释,不可能传递调用测试名称,这是在将通用测试构建为框架以每次提供不同数据(来自 Excel)时需要的。在数据提供者处使用方法 getName() 会导致运行时异常。 getName() 函数仅在使用 @dataprovider 时起作用。但是与@Factory结合使用时会发生异常。有没有办法解决或绕过这个问题?

package Tests;

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

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

public abstract class GenericFactory11 {
protected List<String> data;


public GenericFactory11(List<String> data) {
this.data = data;
}

@DataProvider(name = "getDataForInstances")
public static Object[][] getDataForInstances(ITestContext context,Method m){
System.out.println(context.getName());
System.out.println(m.getName()); // THIS Line Causes the exception

return new Object[][]{
{Collections.singletonList("Java")},
{Arrays.asList("TestNG", "JUnit")},
{Arrays.asList("Maven", "Gradle", "Ant")}
};
}
}


package Tests;

import static org.testng.Assert.assertNotEquals;

import java.util.List;

import org.testng.annotations.Factory;
import org.testng.annotations.Test;

public class Sanity11 extends GenericFactory11 {

@Factory (dataProvider = "getDataForInstances")
public Sanity11(List<String> data) {
super(data);
}

@Test
public void Sanity(){
String text = this.data.get(this.data.size()-1);
System.out.println("Printing Parameters when running test method [" + text + "]");
assertNotEquals(text,"");
}
}


运行代码收到以下错误:

java.lang.RuntimeException:java.lang.NullPointerException 在 org.testng.internal.MethodInitationHelper.invokeMethodNoCheckedException(MethodInitationHelper.java:49)

最佳答案

您看到 NullPointerException 是因为您的数据提供程序声明它将接受 java.lang.reflect.Method 对象,但在本例中,调用方法是java.lang.reflect.Constructor 而不是 Method 对象。

您应该将 java.lang.reflect.Method 替换为 org.testng.ITestNGMethod

修改后的数据提供程序如下所示:

@DataProvider(name = "getDataForInstances")
public static Object[][] getDataForInstances(ITestContext context, ITestNGMethod method) {
System.out.println("test name = " + context.getName());
System.out.println("Method name = " + method.getConstructorOrMethod().getName() + "()\n");

return new Object[][] {
{Collections.singletonList("Java")},
{Arrays.asList("TestNG", "JUnit")},
{Arrays.asList("Maven", "Gradle", "Ant")}
};
}

关于java - 使用@Factory TestNG时将参数传递给dataProvide,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57094211/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com