#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() в последней строке был неправильным. Я исправил пример.