我倾向于抛出尽可能多的选中的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/