我倾向于抛出尽可能多的选中的Exceptions:它使代码混乱(并且我认为选中的Exceptions是Java的可疑方面)。我倾向于在“优化”代码时使用它们,即在特定上下文有意义时使用它们。

当覆盖不抛出必需的Exception的超类/接口方法时,此方法会变得有些复杂,因此我倾向于这样做:

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


其中_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的处理?

最佳答案

您的设置中一定有问题。对于运行时异常,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;从那里开始工作!

关于java - JUnit对RuntimeException的处理(特别是),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41459160/

10-13 09:12