Проблемы с доступом к параметру Collection <> в параметризованном тестировании jUnit 4 - PullRequest
0 голосов
/ 04 ноября 2018
import org.junit.Test;

import java.util.*;
import java.io.*;
import java.math.BigDecimal;
import static org.junit.Assert.assertEquals;

import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith(Parameterized.class)
public class FibonacciTest {
private static final String FILENAME = "###############";
@Parameters
public static Collection<Object[]> data() {
    Scanner s = null;
    String line;
    String[] values;

    Collection<Object[]> check = Arrays.asList(new Object[][]{{0, new BigDecimal(0)}, {1, new BigDecimal(1)},{2, new BigDecimal(1)}});

    try {
        s = new Scanner(new File(FILENAME));
        while (s.hasNextLine()){
            int i = 3;
            line = s.nextLine();
            values = line.split("\\s+");
            ((List<Object[]>) check).add(i, new Object[][]{{0, new BigDecimal(Integer.parseInt(values[1]))}});

        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    int random = (int) (Math.random() * 30);

    return check;
}
private int fInput;
private BigDecimal fExpected;

public FibonacciTest(int input, BigDecimal expected) {
    this.fInput = input;
    this.fExpected = expected;

}
@Test
public void test() {
    assertEquals(fExpected, Fibonacci.fib(fInput));
}
}

Здравствуйте, я действительно новичок в тестировании JUnit и провел много исследований сегодня. Достигнуты сами собой, пробой и стрелой, но я застрял в постоянной проблеме. Я пытаюсь написать рандомизированный тест для динамического вычисления Фибоначчи. Тест выполняется с базовыми вариантами, которые добавляются вручную при проверке коллекции. Они работают. Я хочу добавить больше дел, и они контролируются файлом .txt. Ввод тоже работает, но я не могу добавить объекты в свою коллекцию позже. Это мой подход, но он выдает java.lang.UnsupportedOperationExeption в строке 30:

((List<Object[]>) check).add(i, new Object[][]{{0, new BigDecimal(Integer.parseInt(values[1]))}});

Кастинг был сделан IntelliJ. Много пробовал с разными возможностями для коллекций и списков, но я застрял здесь.

Спасибо за помощь.

1 Ответ

0 голосов
/ 04 ноября 2018

Вы создаете check с Arrays.asList(). Это List основано на входном массиве, поэтому его нельзя расширять.

Один из распространенных подходов - скопировать этот список в ArrayList, что сделает его расширяемым.

вот как то так:

Collection<Object[]> check = Arrays.asList(new Object[][]{{0, new BigDecimal(0)}, {1, new BigDecimal(1)},{2, new BigDecimal(1)}});
check = new ArrayList<Object[]>( check ); // copy to mutable ArrayList

Чтобы избежать уродливого / ненужного приведения, вы можете иметь чек типа List. List расширяет Collection, поэтому он совместим таким образом.

...