Параматризованное тестирование: коллекция не читается JUnit? - PullRequest
1 голос
/ 16 мая 2011

Я использую параметризованные тестовые аннотации JUnit 4 для выполнения тестов на равенство данных, поступающих из неизвестного числа файлов.

По какой-то странной причине тест всегда проверяет один и тот же файл, как если бы всегда использовался один и тот же массив из коллекции, используемой для передачи параметров.

Я уверен, что мне здесь не хватает чего-то элементарного, но я не вижу, что. Может ли кто-нибудь дать мне полезный совет?

Вот мой код:

 @RunWith(value = Parameterized.class)
 public class XMLUnitTest extends XMLTestCase {

static final File ORACLE_DIR = new File("some/directory/path");
static final String PATH_TO_LOG = "some/file/path";

private String oracleXml;
private String testXml;
private String testName;

public XMLUnitTest(String o, String t, String n) {
    this.oracleXml = o;
    this.testXml = t;
    this.testName = n;
}

// (snip) file-handling methods

@Parameters
static public Collection<Object[]> data() {

    String logfile = null;

    File[] xmlFilesArray;
    ArrayList<String> parsedXMLs = new ArrayList<String>();
    ArrayList<String> xmlNames = new ArrayList<String>();

    String[] xmlArgs = new String[3];
    Collection<Object[]> data = new ArrayList<Object[]>();

    try {logfile = readFileAsString(PATH_TO_LOG);} 
    catch (IOException e) {// (snip) error handling}

    String[] parsedLogs = logfile.split("someRegex", 0);

    for (int i = 0; i < parsedLogs.length; i++) {
        parsedLogs[i] = "<xml>"+parsedLogs[i]+"</xml>";
    }

    xmlFilesArray = ORACLE_DIR.listFiles();
    Arrays.sort(xmlFilesArray, nameCompare);
    for (int i = 0; i < xmlFilesArray.length; i++) {
        if (!xmlFilesArray[i].isDirectory()) {
            try {
                parsedXMLs.add(convertXMLFileToString(xmlFilesArray[i].getAbsolutePath()));
                xmlNames.add(xmlFilesArray[i].getName());
            } 
            catch (Exception e) {// (snip) error handling}
        } 
    }

    for (int i = 0; i < parsedLogs.length; i++) {
        xmlArgs[0] = parsedXMLs.get(i);
        xmlArgs[1] = parsedLogs[i];
        xmlArgs[2] = xmlNames.get(i);
        System.out.println(xmlArgs[2]); //debug
        data.add(xmlArgs);
    }

    return data;
}

@SuppressWarnings("unchecked")
@Test
public void equality() throws Exception {

    System.out.println("Working on test: "+testName);
    // (snip) some testing
}
}

Это частично запутано, но должно быть все необходимое, чтобы найти мою ошибку ...

System.out.prints используются для отладки: один в статическом генераторе параметров показывает имена правильных файлов, означая, что объект "данные" является правильным. Тот, что в самом тесте, всегда печатает одно и то же, то есть тест всегда выполняется с одним и тем же массивом параметров (но он выполняется 7 раз, количество массивов в моей коллекции!) Я не понимаю. Я что-то упустил из-за типа параметров, передаваемых в JUnit?

1 Ответ

1 голос
/ 16 мая 2011

Это
String[] xmlArgs = new String[3];
должен быть в цикле for.
Вы всегда обновляете один и тот же экземпляр xmlArgs-Array и вставляете его ..

...