JUnit TestWatcher:失败,是否可以删除抛出的异常(操作Throwable/stacktrace)?
JUnit TestWatcher : failed, is it possible to remove the thrown exception (manipulating Throwable/stacktrace)?
在 JUnit 中,使用 TestWatcher 并覆盖 failed() 函数,是否可以删除抛出的异常并改为自己断言?
用例是:在 Android 上进行功能测试,当测试导致应用程序崩溃时,我想用 [=23] 替换 NoSuchElementException =]断言错误 ("app crashed").
我可以进行自定义断言(当我在 finished() 方法中检测到崩溃时),但是如何删除抛出的异常?
因为在我的报告中它为一个测试创建了异常和断言,所以失败的次数比测试失败的次数多,这是合乎逻辑但令人讨厌的。
我想知道是否有一种方法可以自定义 Throwable 对象以删除特定的 NoSuchElementException,从而操纵堆栈跟踪。
我没做到。 (而且我一定不想在每个测试中都使用 try/catch 来执行它......)。
您可以覆盖 TestWatcher.apply
并为 NoSuchElementException
添加一个特殊的 catch
:
public class MyTestWatcher extends TestWatcher {
public Statement apply(final Statement base, final Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
List<Throwable> errors = new ArrayList<Throwable>();
startingQuietly(description, errors);
try {
base.evaluate();
succeededQuietly(description, errors);
}
catch (NoSuchElementException e) {
// ignore this
}
catch (AssumptionViolatedException e) {
errors.add(e);
skippedQuietly(e, description, errors);
}
catch (Throwable e) {
errors.add(e);
failedQuietly(e, description, errors);
}
finally {
finishedQuietly(description, errors);
}
MultipleFailureException.assertEmpty(errors);
}
};
}
绕过即可。下面给出了示例代码。希望对你有帮助。
try {
// Write your code which throws exception
----
----
----
} catch (NoSuchElementException ex) {
ex.printStackTrace();
if (ex instanceof NoSuchElementException) { // bypass
// NoSuchElementException
// You can again call the method and make a counter for deadlock
// situation or implement your own code according to your
// situation
AssertionError ("app crashed");
if (retry) {
---
---
return previousMethod(arg1, arg2,...);
} else {
throw ex;
}
}
} catch (final Exception e) {
e.printStackTrace();
throw e;
}
我以前解决过这类问题。我的另一个答案有细节。你可以看看我的另一个答案:
在 JUnit 中,使用 TestWatcher 并覆盖 failed() 函数,是否可以删除抛出的异常并改为自己断言?
用例是:在 Android 上进行功能测试,当测试导致应用程序崩溃时,我想用 [=23] 替换 NoSuchElementException =]断言错误 ("app crashed").
我可以进行自定义断言(当我在 finished() 方法中检测到崩溃时),但是如何删除抛出的异常?
因为在我的报告中它为一个测试创建了异常和断言,所以失败的次数比测试失败的次数多,这是合乎逻辑但令人讨厌的。
我想知道是否有一种方法可以自定义 Throwable 对象以删除特定的 NoSuchElementException,从而操纵堆栈跟踪。
我没做到。 (而且我一定不想在每个测试中都使用 try/catch 来执行它......)。
您可以覆盖 TestWatcher.apply
并为 NoSuchElementException
添加一个特殊的 catch
:
public class MyTestWatcher extends TestWatcher {
public Statement apply(final Statement base, final Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
List<Throwable> errors = new ArrayList<Throwable>();
startingQuietly(description, errors);
try {
base.evaluate();
succeededQuietly(description, errors);
}
catch (NoSuchElementException e) {
// ignore this
}
catch (AssumptionViolatedException e) {
errors.add(e);
skippedQuietly(e, description, errors);
}
catch (Throwable e) {
errors.add(e);
failedQuietly(e, description, errors);
}
finally {
finishedQuietly(description, errors);
}
MultipleFailureException.assertEmpty(errors);
}
};
}
绕过即可。下面给出了示例代码。希望对你有帮助。
try {
// Write your code which throws exception
----
----
----
} catch (NoSuchElementException ex) {
ex.printStackTrace();
if (ex instanceof NoSuchElementException) { // bypass
// NoSuchElementException
// You can again call the method and make a counter for deadlock
// situation or implement your own code according to your
// situation
AssertionError ("app crashed");
if (retry) {
---
---
return previousMethod(arg1, arg2,...);
} else {
throw ex;
}
}
} catch (final Exception e) {
e.printStackTrace();
throw e;
}
我以前解决过这类问题。我的另一个答案有细节。你可以看看我的另一个答案: