У меня есть простой метод, пытающийся извлечь некоторый файл. Я бы хотел проверить, нет ли файла, и вот где начинается моя проблема. Тест продолжает терпеть неудачу.Junit 4.12 Исключение тестирования проблемы
Метод что-то вроде:
public Configuration populateConfigs(Configuration config) throws UnRetriableException {
try {
....
} catch (IOException | ConfigurationException e) {
log.error(" getConfiguration : ", e);
throw new UnRetriableException(e);
}
throw new UnRetriableException("problem getting config files.");
}
В моих тестах я попробовал два отдельных решения без успеха.
Используя новый стиль, как это предлагается в SO solution
@Rule public ExpectedException exception = ExpectedException.none(); @Test public void testPopulateConfigurationMissing() throws Exception { exception.expect(UnRetriableException.class); DefaultConfigHandler configurationFactory = new DefaultConfigHandler(testDirectory, testFileThatIsNonExistant); Configuration configuration = configurationFactory.populateConfiguration(systemConfig); }
Для метода два, которые просто, как я знал исключения тестируются.
@Test(expected = UnRetriableException.class) public void testPopulateConfigurationMissing() throws Exception { DefaultConfigHandler configurationFactory = new DefaultConfigHandler(testDirectory, testFileThatIsNonExistant); Configuration configuration = configurationFactory.populateConfiguration(systemConfig); }
Исключение фактически выброшены, как показано ниже:
com.caricah.iotracah.exceptions.UnRetriableException: java.nio.file.NoSuchFileException: world/over
at com.caricah.iotracah.system.handler.impl.DefaultConfigHandler.populateConfiguration(DefaultConfigHandler.java:137)
at com.caricah.iotracah.system.handler.impl.DefaultConfigHandlerTest.testPopulateConfigurationMissingDirectory(DefaultConfigHandlerTest.java:137)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:86)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
Поэтому мой вопрос, что еще мне нужно сделать, чтобы пройти тест?
Конечно, без использования junit3 способ поймать исключение.
Если все в порядке, пожалуйста, взгляните на тест на github: https://github.com/caricah/iotracah/blob/master/src/test/java/com/caricah/iotracah/system/handler/ impl/DefaultConfigHandlerTest.java Ошибка сборки также находится здесь: https://travis-ci.org/caricah/iotracah/builds/74790700 Возможно, вы могли видеть то, что я не вижу. – Bwire
Хорошо, скачал ваш проект и, честно говоря, у меня нет реальной идеи, почему, но я знаю проблему: это «extends Testcase». Я предполагаю, что это каким-то образом приводит к другому способу выполнения ваших модульных тестов. Удалите его (оно вам не понадобится) и вместо этого назовите ваши утверждения «Assert. ', например' Assert.assertTrue (...) '.(Для этого также можно использовать статический импорт, поэтому вам не нужно писать часть Assert). Это решает вашу проблему, и все тесты будут успешными. –
Другая возможность заключается в том, чтобы сохранить 'extends TestCase' и использовать' @RunWith (BlockJUnit4ClassRunner.class) ', что также устраняет вашу проблему, поэтому, вероятно, Runner для TestCase по умолчанию не подходит. –