Проблемы во время выполнения в утверждениях TestNG

#java #arrays #testng #assert

#java #массивы #testng #утверждать

Вопрос:

У меня есть утверждение TestNG, которое иногда может завершаться ошибкой из-за состояния утверждаемого объекта (элемент ArrayList), и когда это произойдет, я хотел бы отобразить это состояние.

Я создал пример, который завершится неудачей во время выполнения, чтобы проиллюстрировать концепцию

 import static org.testng.Assert.assertEquals;



@Test
public void sandbox() {
    ArrayList<Integer> arr = new ArrayList<>();
    assertEquals(arr.size(), 0, "The problem is: "   arr.get(0).toString());
}
  

Я ожидал, что утверждение пройдет, и оно пройдет, когда я удалю третий аргумент (сообщение). Я вижу, что это не проблема с TestNG, поскольку выполнение не выполняется в инструкции, а скорее завершается сбоем непосредственно на этом шаге с

 at java.util.ArrayList.rangeCheck(ArrayList.java:657)
at java.util.ArrayList.get(ArrayList.java:433)
  

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

Спасибо

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

1. Вы создали пустой массив, а затем пытаетесь получить доступ к элементу с индексом 0. Очевидно, что это приведет к ошибке.

2. Да, но я не ожидаю, что это утверждение вообще будет оценено, потому что в этом случае утверждение должно быть передано в любом случае. (аргументом является сообщение только о неудачных утверждениях). В реальной ситуации этот массив обычно пуст, но иногда это не так, и когда это не так, я хотел бы записать содержимое в журнал.

3. В assertEquals: Первый аргумент — это фактическое значение, второе значение — ожидаемое значение, а третье значение — это сообщение об ошибке, которое будет отображаться в случае сбоя. Если вы отображаете в своем сообщении об ошибке arr.get(0) — вы предположили, что в массиве есть хотя бы один элемент. Поэтому вы столкнетесь с исключением IndexOutOfBoundsException, если массив содержит 0 элементов. Не могли бы вы, пожалуйста, указать, чего именно вы пытаетесь достичь?

4. @ShaharRotshtein как я сказал выше, массив не всегда содержит нулевые элементы. Я просто не понимаю, почему логика сообщения (arr.get(0)) даже выполняется во время выполнения, когда предполагается, что она игнорируется при передаче утверждения.

Ответ №1:

Ниже должно сработать:

 import static org.testng.Assert.assertEquals;


@Test
public void sandbox() {
    ArrayList<Integer> arr = new ArrayList<>();
    assertEquals(arr.size(), 0, "The problem is: "   arr);
}

  

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

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

1. Именно то, что я искал. Спасибо!

Ответ №2:

Другого красивого способа сделать это нет, поскольку все ваши аргументы передаются сразу вызываемому объекту, то есть вашему методу, так что arr.get(0) должно быть, они были оценены.

Вы можете просто вызвать next() элемент, только если он использует Iterator поверх вашей коллекции:

 @Test
public void sandbox() {
    ArrayList<Integer> arr = new ArrayList<>();
    Iterator<Integer> it = arr.iterator();
    assertEquals(arr.size(), 0, "The problem is: "   (it.hasNext() ? iterator.next() : ""));
}