我有一个尝试获取某些文件的简单方法。我想测试文件何时不存在,这就是我的问题所在。测试不断失败。
该方法类似于:
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解决方案中建议的新样式
@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捕获异常的方式。
刚刚测试过,可以按预期工作…上课…
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意味着它们将通过JUnit38ClassRunnerthen 执行)。删除它(无论如何您都不需要它)Assert.<something>,例如,使用调用断言Assert.assertTrue(...)。(您也可以为此使用静态导入,因此不必编写Assert部分)。那解决了您的问题,所有测试都成功。
extends Testcase
JUnit38ClassRunner
Assert.<something>
Assert.assertTrue(...)
另一种可能性似乎是保留extends TestCase和使用@RunWith(BlockJUnit4ClassRunner.class),这也可以解决您的问题,因此TestCase的默认Runner可能不适合它。
extends TestCase
@RunWith(BlockJUnit4ClassRunner.class)