Тестовые примеры Junit для вложенного цикла do while - PullRequest
0 голосов
/ 28 апреля 2020

Вот скелет для кода:

    flag1=True
    flag2=True
    do {

        try {

            if (){
                throw new IllegalArgumentException();
            }
            .
            .
            .
           do {

                if () {


                } 
               else {

                }
                .
                . 
                .
                if () {
                }

            } while (flag2);

            flag1 = false;

        } catch (RuntimeException ex) {

            flag1 = true;
        } catch (Exception ex) {

            flag1 = true;


        } catch (Error ex) {

            flag1= true;
        }
        }

    } while (flag1);
}

Я использую junit4 для тестирования. Мне нужно покрыть все блоки try catch для тестирования. Я написал тестовый пример, удовлетворяющий первому условию if и, следовательно, выбрасывающий недопустимое аргументное исключение, но после выброса код переходит к do l oop, где flag1 всегда остается верным

1 Ответ

0 голосов
/ 28 апреля 2020

Для начала звучит так, будто вы новичок Java. Если это так, позвольте мне предложить прочитать об обработке исключений в Java. Я думаю, это поможет вам понять причину такого поведения. Вот несколько быстрых уроков по этой теме c от Oracle: https://docs.oracle.com/javase/tutorial/essential/exceptions/

С учетом сказанного ниже приведено мое объяснение того, что вызывает поведение, которое вы описали: 1. flag1 остается верным. 2. цикл не останавливается.

1. Причина, по которой flag1 не установлена ​​в true, заключается в том, что при возникновении исключения IllegalArgumentException весь код между местом, в котором он создается, и блоками перехвата исключений будет пропущен. Это включает пропуск строки flag1 = false;.

2. Причина, по которой циклы while не завершаются при возникновении исключения IllegalArgumentException, заключается в том, что IllegalArgumentException наследуется от RuntimeException, как вы можете видеть здесь: https://docs.oracle.com/javase/7/docs/api/java/lang/IllegalArgumentException.html. Это означает, что ваш блок catch catch (RuntimeException ex) будет перехватывать выброшенное исключение. Таким образом, произойдет то, что код в блоке захвата RuntimeException (retry = true;) будет выполнен, а затем выполнение продолжится после блока try-catch. Поскольку это все еще внутри внешнего do-while l oop, цикл будет продолжаться.

...