junit对runtimeexception的处理(特别是)

zaqlnxep  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(316)

我倾向于投出尽可能多的支票 Exceptions 尽可能地向上:它将代码分离(我认为已检查) Exceptions 作为java的一个可疑方面)。我倾向于在“精炼”代码时使用它们。。i、 当它对特定的环境有意义时。
当重写不抛出必要的 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;
    }

i、 如果你没有这个 expected 设置总是会导致测试失败(因为 RuntimeException “忽略”了 try .. catch ). 但为了满足 expected 然后你必须重新播放 RuntimeException 考试结束时。。。
... 有没有办法改变junit对 RuntimeExceptions ?

bq8i3lrv

bq8i3lrv1#

你的设置一定有问题。junit对运行时异常没有任何这样的特殊处理。
我把这辆车组装起来;然后就过去了。

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;从那里开始工作!

相关问题