Как написать тест Junit для этого исключения FileNotFoundException - PullRequest
1 голос
/ 23 мая 2019

Как мне написать тест Junit для FileNotFoundException, нужно ли что-то делать в тесте, чтобы мой файл "numbers.txt" не был виден?

public void readList() {
        Scanner scanner = null;
        try {
            scanner = new Scanner(new File("numbers.txt"));

            while (scanner.hasNextInt()) {
                final int i = scanner.nextInt();
                ListOfNumbers.LOGGER.info("{}", i);


            }
        } catch (final FileNotFoundException e) {
            ListOfNumbers.LOGGER.info("{}","FileNotFoundException: " + e.getMessage());
        } finally {
            if (scanner != null) {
                ListOfNumbers.LOGGER.info("{}","Closing PrintReader");
                scanner.close();
            } else {
                ListOfNumbers.LOGGER.info("{}","PrintReader not open");
            }
        }

    }

Ответы [ 2 ]

4 голосов
/ 23 мая 2019

На самом деле, вы планируете тестировать саму JVM, чтобы увидеть, возникает ли соответствующее исключение при определенных условиях. Некоторые утверждают, что это больше не модульное тестирование, и вам нужно предположить, что то, что находится на внешней стороне JMV, просто работает и не нуждается в тестировании.

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

Давайте выведем это наружу:

public void readList(File inputFile) throws FileNotFoundException {
  //... do your code logic here ...
}

Затем вы можете использовать JUnit @Rule с именем ExpectedException в своем модульном тесте:

@RunWith(MockitoJUnitRunner.class)
public class ReaderTest {

  @Rule
  public ExpectedException exception = ExpectedException.none(); // has to be public

  private YourReader subject = new YourReader();

  @Test(expect = FileNotFoundException.class)
  public void shouldThrowFNFException() {
    // given
    File nonExistingFile = new File("blabla.txt");

    // when
    subject.readList(nonExistingFile);
  }

  // ... OR ...

  @Test
  public void shouldThrowFNFExceptionWithProperMessage() {
    // given
    File nonExistingFile = new File("blabla.txt");

    exception.expect(FileNotFoundException.class);
    exception.exceptionMessage("your message here");

    // when
    subject.readList(nonExistingFile);
  }
}
0 голосов
/ 23 мая 2019

Вы можете ожидать FileNotFoundException, как только ваш readList() не найдет numbers.txt файл. Кроме того, вы обрабатываете FileNotFoundException, поэтому вам нужно throw снова в блок catch.

Попробуйте лайк:

@Test(expected = java.io.FileNotFoundException.class)
public void testReadListForFileNotFoundException(){
// call your method readList
}

Бросьте его так, чтобы ваш тестовый сценарий его ожидал.

catch (final FileNotFoundException e) {
   ListOfNumbers.LOGGER.info("{}","FileNotFoundException: " + e.getMessage());
   throw e;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...