Junit5 验证执行过程中是否抛出异常
Junit5 verify if an exception was thrown during the execution
在 JUnit5 中,我如何验证是否曾抛出异常但后来在执行过程中被捕获?
例如,考虑
public Optional<Foo> MethodA(Argument a) {
try {
/*
Some logic based on Aargument a providing biproduct Argument b
*/
methodB(b)
/*
some other logic capable of throwing exception
*/
} catch(Exception e) {
// log exception
return Optional.empty();
}
}
private BReturnValue MethodB(Argument b) throws Exception{
throw new IllegalStateException()
}
现在无论哪种方法,无论是 A 还是 B 抛出异常,作为 MethodA 的 return 值,我都会收到一个空的 Optional,因此我不能使用 assertThrows() 但我实际上是在测试一个测试导致 MethodB 抛出异常的情况。
我可以吗?如果可以,我如何验证在执行期间是否从 MethodB
?
抛出异常
备注
- 目前我正在使用 2 个测试,一个用于验证空 Optional 是否被 returned,另一个用于通过手动提供
biproduct argument
并使用 assertThrows()
直接调用 MethodB() .
但我正在寻找一些更好的方法来验证 biproduct argument
是由 MethodA 和 methodB 抛出异常形成的。而且我不想直接测试MethodB
,而是通过MethodA
.
JUnit 无法检测抛出并捕获的异常。这将需要分析执行情况,虽然在某种程度上在技术上可能是可行的,但实施如此复杂的机制会适得其反。
在这种情况下,我想知道为什么抛出异常对测试很重要?在任何情况下,只要您的测试将 Optional.empty()
return 值视为失败测试,测试就会失败,尽管它可能根本不应该捕获异常。在这种情况下,如果测试失败,你必须做额外的工作来确定哪里出了问题,但你仍然得到了重要信息:出了点问题。
如果您觉得了解异常发生的位置很重要,那么很可能应该单独测试这些方法,这需要 redesigning/refactoring 代码更易于测试。
在 JUnit5 中,我如何验证是否曾抛出异常但后来在执行过程中被捕获? 例如,考虑
public Optional<Foo> MethodA(Argument a) {
try {
/*
Some logic based on Aargument a providing biproduct Argument b
*/
methodB(b)
/*
some other logic capable of throwing exception
*/
} catch(Exception e) {
// log exception
return Optional.empty();
}
}
private BReturnValue MethodB(Argument b) throws Exception{
throw new IllegalStateException()
}
现在无论哪种方法,无论是 A 还是 B 抛出异常,作为 MethodA 的 return 值,我都会收到一个空的 Optional,因此我不能使用 assertThrows() 但我实际上是在测试一个测试导致 MethodB 抛出异常的情况。
我可以吗?如果可以,我如何验证在执行期间是否从 MethodB
?
备注
- 目前我正在使用 2 个测试,一个用于验证空 Optional 是否被 returned,另一个用于通过手动提供
biproduct argument
并使用assertThrows()
直接调用 MethodB() .
但我正在寻找一些更好的方法来验证 biproduct argument
是由 MethodA 和 methodB 抛出异常形成的。而且我不想直接测试MethodB
,而是通过MethodA
.
JUnit 无法检测抛出并捕获的异常。这将需要分析执行情况,虽然在某种程度上在技术上可能是可行的,但实施如此复杂的机制会适得其反。
在这种情况下,我想知道为什么抛出异常对测试很重要?在任何情况下,只要您的测试将 Optional.empty()
return 值视为失败测试,测试就会失败,尽管它可能根本不应该捕获异常。在这种情况下,如果测试失败,你必须做额外的工作来确定哪里出了问题,但你仍然得到了重要信息:出了点问题。
如果您觉得了解异常发生的位置很重要,那么很可能应该单独测试这些方法,这需要 redesigning/refactoring 代码更易于测试。