Использование assertThrows при использовании Junit-теста для основного метода с использованием FileInputStream

#java #junit #assert #fileinputstream

#java #junit #утверждать #fileinputstream

Вопрос:

В настоящее время я пытаюсь использовать JUnit-тест для моего основного метода для игры mastermind. Мой входной файл содержит ввод с недопустимой длиной для ввода, и я ожидаю, что мой основной метод выдаст исключение где-нибудь в конце строки. Как мне проверить, что исключение генерируется во время выполнения моего основного метода? Я пытался использовать следующий код для решения этой проблемы:

 @Test
void testPlayErrors2() throws FileNotFoundException {
    String[] args= null;
    final InputStream original=System.in; 
    final InputStream fileIn= new FileInputStream(
        new File("playTest.txt"));
    System.setIn(fileIn);
    assertThrows(
               MastermindIllegalLengthException.class,
               () -> (Mastermind.main(args)),
               "Expected Mastermind.main() to throw MastermindIllegalLengthException, but it didn't"
        );
    
    System.setIn(original);
}
 

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

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

1. Пока ваш тест выглядит хорошо. Какое сообщение об ошибке вы получаете? Вы пробовали отлаживать свой код?

2. Поэтому, когда я навожу курсор на ошибки, я вижу следующее: В assertThrows: метод assertThrows(Class<T>, Executable, String) в утверждениях типа неприменим для аргументов (Class<MastermindIllegalLengthException>, () -> {}, String) в Mastermind.main(аргументы): Недопустимое выражение как оператор

3. Также, если я изменю это для проверки конкретных методов, я получу сообщение: целевой тип этого выражения должен быть функциональным интерфейсом при вызове метода.

Ответ №1:

Вы должны удалить круглые скобки из Mastermind.main(аргументы):

 assertThrows(
  MastermindIllegalLengthException.class,
  () -> Mastermind.main(args),
  "Expected Mastermind.main() to throw MastermindIllegalLengthException, but it didn't"
);
 

Я бы также удалил сообщение и использовал стандартное сообщение об ошибке JUnit:

 assertThrows(
  MastermindIllegalLengthException.class,
  () -> Mastermind.main(args)
);