package ru.stqa.trainings.testng.tricky3.sample32; import org.testng.annotations.DataProvider; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.List; public class SingleParameterDataProviders { @DataProvider public static Object[][] arrayDataProvider(Method m) throws NoSuchFieldException, IllegalAccessException { if (m.isAnnotationPresent(SingleParameterDataSource.class)) { if (m.getParameterTypes().length != 1) { throw new Error("Method should have a single parameter: " + m); } SingleParameterDataSource dataSource = m.getAnnotation(SingleParameterDataSource.class); Class clazz = dataSource.clazz(); if (clazz.equals(void.class)) { clazz = m.getDeclaringClass(); } Field field = clazz.getField(dataSource.value()); Object[] data = (Object[]) field.get(null); Object[][] result = new Object[data.length][]; for (int i = 0; i < data.length; i++) { result[i] = new Object[]{data[i]}; } return result; } else { throw new Error("There is no @SingleParameterDataSource annotation on method " + m); } } @DataProvider public static Object[][] listDataProvider(Method m) throws NoSuchFieldException, IllegalAccessException { if (m.isAnnotationPresent(SingleParameterDataSource.class)) { if (m.getParameterTypes().length != 1) { throw new Error("Method should have a single parameter: " + m); } SingleParameterDataSource dataSource = m.getAnnotation(SingleParameterDataSource.class); Class clazz = dataSource.clazz(); if (clazz.equals(void.class)) { clazz = m.getDeclaringClass(); } Field field = clazz.getField(dataSource.value()); List<Object> data = (List<Object>) field.get(null); Object[][] result = new Object[data.size()][]; for (int i = 0; i < data.size(); i++) { result[i] = new Object[]{data.get(i)}; } return result; } else { throw new Error("There is no @SingleParameterDataSource annotation on method " + m); } } }