2

Я пытаюсь получить данные с помощью @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 без передачи какого-либо аргумента вызываемому методу.

Надеюсь на ваши предложения.

+0

Конечно, будет. @parameters работает, когда testng вызывает этот метод, а не когда вы его явно вызываете. Если вы хотите позвонить, вы должны отправить правильное значение, которое оно может ожидать. Почему вы не берете значение параметра на уровне датапортера. – Shamik

+0

Итак, это не способ или обходной путь для разделения DataProviders и кода, работающего с параметрами XML? Это основная цель, поскольку методы работы с XML-файлом очень многократно используются, и обычно DataProviders должны возвращать комбинацию из нескольких значений, как из XML, как из других методов, таких как генераторы строк. –

+0

Я не совсем понимаю ваши требования. Но да, конечно, вы можете отделять dataproviders от кода, и это нужно делать с вашим внедрением. Вы пытались использовать @paramers в методе dataprovider, а затем действовать по его значению?Я думаю, что ваш dataprovider получит доступ к параметрам в xml, а затем вы можете вызвать этот метод с этим значением и получить желаемый результат. – Shamik

ответ

1

Я нашел решение. Лучший способ передать параметр из XML в @DataProvider проходит ITestContext context в качестве аргумента в @DataProvider метода, а затем получить нужный параметр с помощью:

context.getCurrentXmlTest().getParameter("parameterName"); 

Полного кода @DataProvider:

@DataProvider(name = "getRandomFileName") 
    public Object[][] getRandomFileName(ITestContext context) { 
     String extensionsArray = context.getCurrentXmlTest().getParameter("extensionsArray"); 
     return new Object[][]{new Object[]{pf.generateRandomFileNameWithExtension(extensionsArray)}}; 
    } 

Спасибо всем за ваши предложения.

Смежные вопросы