2

我倾向于尽可能多地进行检查Exceptions:它使代码变得杂乱无章(我认为检查Exceptions是 Java 的一个可疑方面)。我倾向于在“优化”代码时使用它们。即,当它对特定上下文有意义时。

当覆盖不抛出所需的超类/接口方法时,这种方法会稍微复杂一些Exception,因此我倾向于这样做:

@Override
public void close() {
    try {
        _close();
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

where_close是处理所有业务的私有方法。

当涉及到 JUnit 时,如果你真的想测试抛出异常的东西,_close()那么结果RuntimeException似乎是由 JUnit 以“无条件”的方式处理的:它似乎总是以失败消息停止测试。 ..即使你真的抓住并处理它try .. catch

我发现了一种“解决方法”(CUT 类在关闭closeableComponents时将其全部关闭):

@Test (expected = RuntimeException.class)
public void errorFlagShouldBeSetIfAnyCloseablesThrowExceptionWhenCUTCloses() throws Exception {
    Closeable spyCloseable = spy( new Closeable(){
        @Override
        public void close() throws IOException {
            throw new IOException( "dummy" );
        }});
    spyCUT.addCloseableComponent( spyCloseable );
    Exception blob = null;
    try{
        spyCUT.close();
    }catch( Exception e ){
        blob = e;
    }
    assertThat( spyCUT.getErrorFlag() ).isTrue();
    if( blob != null ){
        throw blob;
    }

即,如果您没有此expected设置,您总是会遇到测试失败(因为RuntimeException“忽略” try .. catch)。但是为了满足expected你必须RuntimeException在测试结束时重新抛出...

...有什么方法可以改变 JUnit 的处理方式RuntimeExceptions吗?

4

1 回答 1

1

您的设置一定有问题。JUnit对运行时异常没有任何此类特殊处理。

我把这个 MCVE 放在一起;它通过了。

static class CUT {
    void close(Closeable _close) {
        try {
            _close.close();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

@Test
public void test() throws Exception {
    Closeable spyCloseable = Mockito.spy(new Closeable() {
        @Override
        public void close() throws IOException {
            throw new IOException("dummy");
        }
    });
    Exception blob = null;
    try {
        new CUT().close(spyCloseable);
        fail("should have thrown");
    } catch (Exception e) {
        blob = e;
    }
    assertThat(blob.getMessage(), is("java.io.IOException: dummy"));
}

这不完全是你在那里的东西。但在我看来“足够接近”。

长话短说:您的答案来自其他地方。我建议:和我一样:创建一个真正的mcve;并从那里开始工作!

于 2017-01-04T09:59:28.177 回答