Циклы для заполнения параметров JUnit?

#java #arrays #junit #junit4 #nested-loops

#java #массивы #junit #junit4 #вложенные циклы

Вопрос:

Я пытаюсь извлечь отдельные URL-адреса из списка массивов и использовать их в качестве аргументов для серии тестов JUnit. Однако до сих пор я не смог этого сделать.

Этот проект фокусируется на веб-тестировании, и метод, который я использую, извлекает код состояния HTTP для заданного URL.

Приведенный ниже код представляет собой раздел параметров из теста JUnit. Он принимает URL-адрес и ожидаемое значение в качестве входных данных и сравнивает их с фактическим значением vale, чтобы определить, проходит ли каждый из них.

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


        Object[][] data = new Object[][]{{"http://google.com",200}, {"http://yahoo.com", 404}};


        return Arrays.asList(data);
    }
  

Есть ли у кого-нибудь опыт перебора массивов списков с параметризованным тестированием JUnit? Пример)

 Object [][] data = new Object [][]{{urlArray.get(0), statusArray.get(0},....{urlArray.get(i), statusArray.get(i)}}
  

Спасибо за любую помощь, которую вы можете предоставить!

Полный код ниже:

 import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import org.junit.Test;
import org.junit.Before; 
import org.junit.Assert;
import org.junit.runner.RunWith; 
import org.junit.runners.Parameterized; 
import org.junit.runners.Parameterized.Parameters;



@RunWith(Parameterized.class)

public class CodeFinderTest extends CodeFinder {

private String url; 
private int expected; 


public CodeFinderTest(String url, int expected){
    this.url = url; 
    this.expected = expected; 

}


CodeFinder instance;
    @Before
    public void setup(){
        instance = new CodeFinder(); 
}


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


        Object[][] data = new Object[][]{{"http://google.com",200}, {"http://yahoo.com", 404}};


        return Arrays.asList(data);
    }

    @Test
    public void testFinder() throws IOException{
        Assert.assertEquals(expected, instance.status(url)); 
    }
  

}

Комментарии:

1. Не могли бы вы опубликовать полный исходный код вашего тестового класса? Используете ли вы правильный тестовый бегун, т.е. @RunWith(Parameterized.class )? Вот также пример для параметризованных тестов .

2. Были внесены предлагаемые изменения. Полный исходный код теперь можно найти выше. @John

3. Не могли бы вы подробнее рассказать, что именно пошло не так? Почему ваш тестовый класс расширяет CodeFinder?

4. Ничего не пошло не так, персей, но я не смог реализовать цикл для создания массива в разделе «@Parameters». Используя приведенный выше код, я мог вручную ввести значения, но когда я попытался сохранить их в массиве и передать их, я не смог. @John

Ответ №1:

Метод, который предоставляет тестовые данные, является реальным методом. Следовательно, вы можете сделать это:

 @Parameters
public static Collection<Object[]> testData(){
  List<Object[]> data = new ArrayList<>();
  Iterator<String> itUrl = urlArray.iterator();
  Iterator<Integer> itStatus = statusArray.iterator();
  while (itUrl.hasNext())
    data.add(new Object [] {itUrl.next(), itStatus.next()});
  return data;
}
  

Комментарии:

1. Большое спасибо за ввод Стефана, но у меня есть вопрос по поводу оператора return . У меня возникли проблемы с совместимостью <object> / Collection<object>. Я получаю сообщение об ошибке, в котором говорится, что типы не совпадают (невозможно преобразовать из object[] в collection <object[]> ). Есть какие-либо идеи, что может быть причиной этой проблемы?

2. Вызов toArray() в последней строке был неправильным. Я исправил пример.