Подход 3 кажется мне вполне уместным. Объект [] [] - это просто способ хранения всех тестовых случаев, где каждый индекс объекта [] будет просто тестовым примером. Каждый тестовый пример должен соответствовать количеству и типу аргументов, ожидаемых методом теста.
Object [] [] выбран для хранения тестовых случаев, поскольку все объекты в java либо расширяются от Object, либо в случае примитивов могут быть автоматически упакованы в его объектную форму, которая расширяется от Object.
TestNG затем будет обрабатывать подключение поставщика данных к каждому из своих тестов, а также применять и приводить параметры тестового примера для каждого.
Например:
@Test(dataProvider="getTestCases")
public void test(List<Integer> list, double d){
// test code
}
Ожидается что-то вроде:
@DataProvider
public Object[][] getTestCases(){
return new Object[][] {
{Arrays.asList(1, 2, 3), 1.0},
{Arrays.asList(4, 5, 6), 2.0}
};
}
Где {Arrays.asList (1, 2, 3), 1.0} будет тестовый пример 1, а {Arrays.asList (4, 5, 6), 2.0} будет тестовый случай 2.
EDIT:
Чтобы решить проблему изменения кода для очистки поставщика данных, Хольгер представил следующее:
@DataProvider(name="provideData")
public static Object[][] getData() {
Map<String, List<String>> map = new HashMap<>();
map.put("Test[]", Arrays.asList("First Value", "Second Value", "Third Value", "Fourth Value"));
map.put("month_start", Arrays.asList("2019-06-01"));
map.put("month_end", Arrays.asList("2019-06-30"));
map.put("viewers[]", Arrays.asList("ESPN"));
map.put("Result[]", Arrays.asList("Fifth Value", "Sixth Value", "Seventh Value"));
return new Object[][]{{map}};
}
Что касается причины, по которой подходы 1 и 2 не работают для вас, это связано с несоответствием типа DataProvider / количества возвращенных тестовых случаев. Ваш тест ожидает, что ему будет предоставлена карта
public void TestMethod(Map<String,Object> map)
, который ожидает один параметр типа Map<String,Object>
от поставщика данных, однако вы пытаетесь передать строку и строки переменного размера для подхода 1 или строку и список строк для подхода 2. Оба из которых имеют разные типы и количество параметров, чем одна карта.
Я бы рекомендовал изменить тест, чтобы он принимал Map<String, List<String>>
для обеспечения большей ясности в тесте, если только последний не является тем, что требуется для самой функции, которая тестируется.
В тестировании предпочтение отдается простоте, потому что если вы добавите слишком много сложности к самому тесту. Тест может стать более подверженным ошибкам, чем тестируемый объект. Таким образом, простого возврата карты должно быть достаточно.