2015-08-09 4 views
0

У меня есть простой метод, пытающийся извлечь некоторый файл. Я бы хотел проверить, нет ли файла, и вот где начинается моя проблема. Тест продолжает терпеть неудачу.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."); 
} 

В моих тестах я попробовал два отдельных решения без успеха.

  1. Используя новый стиль, как это предлагается в 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); 
    
    } 
    
  2. Для метода два, которые просто, как я знал исключения тестируются.

    @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 способ поймать исключение.

ответ

2

Просто проверял, работает, как ожидалось ... Класс ...

public class SomeClass { 

    public void someMethod(String someParameter) throws SomeException { 
     throw new SomeException("Yep, really a SomeException"); 
    } 

} 

Исключение ...

public class SomeException extends Exception { 

    public SomeException(String message) { 
     super(message); 
    } 

} 

А класс тест, оба теста работают точно так же, как и ожидалось:

public class TestSomeClass { 

    @Rule 
    public ExpectedException exception = ExpectedException.none(); 

    @Test 
    public void testSomeMethodWithRule() throws SomeException { 
     exception.expect(SomeException.class); 

     new SomeClass().someMethod("something"); 
    } 

    @Test(expected=SomeException.class) 
    public void testSomeMethodWithExpected() throws SomeException { 
     new SomeClass().someMethod("something"); 
    } 
} 

После загрузки проекта (см комментарий), я не знаю наверняка почему, но я знаю , что проблема: это extends Testcase. Я предполагаю, что это каким-то образом приводит к другому способу выполнения ваших модульных тестов (stacktrace подразумевает, что они выполняются с JUnit38ClassRunner). Удалите его (в любом случае, он вам не нужен) и вместо этого назовите свои утверждения с помощью Assert.<something>, например Assert.assertTrue(...). (Для этого также можно использовать статический импорт, поэтому вам не нужно писать часть Assert). Это решает вашу проблему, и все тесты будут успешными.

Возможно, существует еще одна возможность сохранить extends TestCase и использовать @RunWith(BlockJUnit4ClassRunner.class), что также устраняет вашу проблему, поэтому, вероятно, по умолчанию Runner для TestCase не подходит.

+0

Если все в порядке, пожалуйста, взгляните на тест на 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

+1

Хорошо, скачал ваш проект и, честно говоря, у меня нет реальной идеи, почему, но я знаю проблему: это «extends Testcase». Я предполагаю, что это каким-то образом приводит к другому способу выполнения ваших модульных тестов. Удалите его (оно вам не понадобится) и вместо этого назовите ваши утверждения «Assert. ', например' Assert.assertTrue (...) '.(Для этого также можно использовать статический импорт, поэтому вам не нужно писать часть Assert). Это решает вашу проблему, и все тесты будут успешными. –

+1

Другая возможность заключается в том, чтобы сохранить 'extends TestCase' и использовать' @RunWith (BlockJUnit4ClassRunner.class) ', что также устраняет вашу проблему, поэтому, вероятно, Runner для TestCase по умолчанию не подходит. –

Смежные вопросы