Я пытаюсь получить данные с помощью @DataProvider, который возвращает Object[][]
, в котором я вставляю значение, вызывая другой метод. Этот метод, в свою очередь, использует @Parameters для получения значения из XML.java TestNG методы вызова с @Parameters внутри @DataProvider
Проблемы заключается в том, что я получаю NullPointerException
, потому что в @DataProvider вызов нужного метода с @Parameters пропускания значения null
, в надежде, что @Parameters изменит это значение, чтобы присвоить один из XML. В то же время я не могу вызвать метод, не передавая ему никаких аргументов.
Код:
Класс TestSuite
package blablabla.mainPackage;
import blablabla.framework.*;
import java.io.IOException;
import java.util.ArrayList;
import org.testng.annotations.Test;
public class TestSuite extends Config {
FilesOperations fOps = new FilesOperations();
List<String> fileNames = new ArrayList<String>();
@Test(groups = {"positive"},
dataProvider = "getRandomFileName",
priority = 1)
public void createFileRandom(String fileName) throws IOException {
fOps.createFile(fileName, tempPath);
fileNames.add(fileName);
}
}
Класс Config
package blablabla.mainPackage;
import blablabla.framework.*;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.Parameters;
public class Config extends DataProviders{
public static Path tempPath;
DirectoriesOperations dirOps = new DirectoriesOperations();
@BeforeSuite(alwaysRun = true)
@Parameters({"path"})
public void tearUp(String path) throws IOException {
tempPath = dirOps.createTempDir(Paths.get(path));
}
@AfterSuite(alwaysRun = true, enabled = true)
public void tearDown() throws IOException {
dirOps.deleteTempDirOnExit(tempPath);
}
}
Класс DataProviders
package blablabla.framework;
import java.io.IOException;
import org.testng.annotations.DataProvider;
public class DataProviders {
FilesOperations fOps = new FilesOperations();
HelpFunctions hf = new HelpFunctions();
ParametrizedFunctions pf = new ParametrizedFunctions();
@DataProvider(name = "getRandomFileName")
public Object[][] getRandomFileName() {
return new Object[][]{new Object[]{pf.generateRandomFileNameWithExtension(null)}};
}
}
Класс ParametrizedFunctions
package blablabla.framework;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import org.testng.annotations.Parameters;
public class ParametrizedFunctions {
FilesOperations fOps = new FilesOperations();
HelpFunctions hf = new HelpFunctions();
@Parameters({"extensionsArray"})
public String generateRandomFileNameWithExtension(String extensionsArray) {
return fOps.getFileName(hf.stringToArray(extensionsArray), null);
}
}
Здесь @Parameters({"extensionsArray"})
does't обеспечивают значение из файла XML. Требуется только null
, который был передан в качестве аргумента для метода вызова generateRandomFileNameWithExtension()
. И в то же время я не могу назвать этот метод от @DataProvider без передачи какого-либо аргумента вызываемому методу.
Надеюсь на ваши предложения.
Конечно, будет. @parameters работает, когда testng вызывает этот метод, а не когда вы его явно вызываете. Если вы хотите позвонить, вы должны отправить правильное значение, которое оно может ожидать. Почему вы не берете значение параметра на уровне датапортера. – Shamik
Итак, это не способ или обходной путь для разделения DataProviders и кода, работающего с параметрами XML? Это основная цель, поскольку методы работы с XML-файлом очень многократно используются, и обычно DataProviders должны возвращать комбинацию из нескольких значений, как из XML, как из других методов, таких как генераторы строк. –
Я не совсем понимаю ваши требования. Но да, конечно, вы можете отделять dataproviders от кода, и это нужно делать с вашим внедрением. Вы пытались использовать @paramers в методе dataprovider, а затем действовать по его значению?Я думаю, что ваш dataprovider получит доступ к параметрам в xml, а затем вы можете вызвать этот метод с этим значением и получить желаемый результат. – Shamik