Junit 4.12问题测试异常

时间:2015-08-09 12:46:36

标签: java exception junit junit4

我有一个简单的方法试图获取一些文件。我想测试文件何时不存在,这就是我的问题开始的地方。测试不断失败。

该方法类似于:

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);
    
    }
    
  3. 实际抛出了异常,如下所示:

    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方式捕获异常。

1 个答案:

答案 0 :(得分: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),这也解决了您的问题,因此可能是TestCase的默认Runner不符合它。