Java JUnitTestWatcher:失败,是否可以删除抛出的异常(操作Throwable/stacktrace)?

Java JUnitTestWatcher:失败,是否可以删除抛出的异常(操作Throwable/stacktrace)?,java,android,junit,try-catch,throwable,Java,Android,Junit,Try Catch,Throwable,在JUnit中,使用TestWatcher并重写failed()函数,是否可以删除抛出的异常,而代之以生成自己的断言 用例是:在Android上进行功能测试时,当测试导致应用程序崩溃时,我想用一个断言错误(“应用程序崩溃”)替换NoTouchElementException 我可以进行自定义断言(当我在finished()方法中检测到崩溃时),但是如何删除抛出的异常呢 因为在我的报告中,它为一个测试创建了异常和断言,所以失败比失败中的测试要多,这是合乎逻辑的,但很烦人 我想知道是否有一种方法可以

在JUnit中,使用TestWatcher并重写failed()函数,是否可以删除抛出的异常,而代之以生成自己的断言

用例是:在Android上进行功能测试时,当测试导致应用程序崩溃时,我想用一个断言错误(“应用程序崩溃”)替换NoTouchElementException

我可以进行自定义断言(当我在finished()方法中检测到崩溃时),但是如何删除抛出的异常呢

因为在我的报告中,它为一个测试创建了异常和断言,所以失败比失败中的测试要多,这是合乎逻辑的,但很烦人

我想知道是否有一种方法可以定制Throwable对象,从而通过操纵stacktrace来删除特定的NosTouchElementException


我没能做到。(当然,我不想在每次测试中都使用try/catch来执行它…。

您可以覆盖
TestWatcher。应用
并为
无接触异常添加一个特殊的
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);
            }
        };
    }
公共类MyTestWatcher扩展了TestWatcher{
公开声明申请(最终声明基础、最终说明){
返回新语句(){
@凌驾
public void evaluate()可丢弃{
列表错误=新建ArrayList();
安静启动(描述、错误);
试一试{
base.evaluate();
安静地成功(描述、错误);
}
捕获(无接触元素例外e){
//忽略这一点
}
捕获(假设违反异常e){
添加(e);
悄无声息地跳过(e、描述、错误);
}
捕获(可丢弃的e){
添加(e);
失败(e、描述、错误);
}
最后{
安静地完成(描述、错误);
}
MultipleFailureException.assertEmpty(错误);
}
};
}

您可以通过绕过来完成。下面给出了一个示例代码。希望它能帮助您

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;
}
我以前解决过此类问题。我的另一个答案有详细信息。您可以浏览我的另一个答案: