我有一些junit测试,它们创建了一些也应该关闭的资源。
实现此逻辑的一种方法是使用@Before
和@After
方法。
我所做的是将创建封装在某个实用程序类中以供重用。例如:
class UserCreatorTestUtil implements AutoClosable {
User create() {...}
void close() {...}
}
整个要点是让对象自行关闭,而不是需要记住在@After
中关闭它。
用法应该是:
@Test
void test() {
try (UserCreatorTestUtil userCreatorTestUtil = new UserCreatorTestUtil()) {
User user = userCreatorTestUtil.create();
// Do some stuff regarding the user's phone
Assert.assertEquals("123456789", user.getPhone());
}
}
问题是junit的assert关键字抛出了一个Error
--而不是Exception
。
try-with- Error
是否会“捕获”关闭并调用close方法?
*在try-with-resources documentation中找不到答案。
发布于 2016-11-02 19:54:13
它不会catch
任何东西。但是它确实finally
关闭了所有的资源。
finally
会阻止are run even when an Error is thrown。
发布于 2016-11-02 20:03:29
基本try-with-resources语句的伪代码是(参见Java Language Specification §14.20.3.1
):
final VariableModifiers_minus_final R Identifier = Expression;
Throwable #primaryExc = null;
try ResourceSpecification_tail
Block
catch (Throwable #t) {
#primaryExc = #t;
throw #t;
} finally {
if (Identifier != null) {
if (#primaryExc != null) {
try {
Identifier.close();
} catch (Throwable #suppressedExc) {
#primaryExc.addSuppressed(#suppressedExc);
}
} else {
Identifier.close();
}
}
}
正如您所看到的,它捕获Throwable
而不是包含Error
的Exception
,而只是为了获取主要异常,以便将关闭资源时发生的任何异常添加为受抑制的异常。
您还可以注意到,您的资源在finally
块中被关闭,这意味着无论发生什么,、它们都将被关闭(当然,System.exit
的情况除外,因为它终止了当前正在运行的Java Virtual Machine),即使抛出Error
或Throwable
的任何子类也是如此。
发布于 2016-11-02 20:00:00
尝试使用资源本身并不能捕获任何东西。
但是,您可以将catch
块附加到try-with-resources块的末尾,以捕获您喜欢的任何类型的Throwable
:
try (UserCreatorTestUtil userCreatorTestUtil = new UserCreatorTestUtil()) {
// ... Whatever
} catch (RuntimeException e) {
// Handle e.
} catch (Exception | Throwable t) {
// Handle t.
}
https://stackoverflow.com/questions/40379293
复制相似问题