4

在 JUnit 中,使用 TestWatcher 并覆盖failed()函数,是否可以删除抛出的异常并做出自己的断言?

用例是:在 Android 上进行功能测试,当测试使应用程序崩溃时,我想用AssertionError(“应用程序崩溃”)替换NoSuchElementException 。

我可以毫无问题地进行自定义断言(当我检测到finished()方法崩溃时),但是如何删除抛出的异常?

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

我想知道是否有一种方法可以自定义 Throwable 对象以删除特定的 NoSuchElementException,从而操纵堆栈跟踪。

我没能做到。(而且我一定不想在每次测试中都使用 try/catch 来执行它......)。

4

2 回答 2

3

您可以覆盖TestWatcher.apply并添加一个特殊catchNoSuchElementException

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);
            }
        };
    }
于 2016-06-01T11:15:50.380 回答
1

你可以通过绕过来做到这一点。下面给出了一个示例代码。希望它会帮助你。

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;
}

我以前解决过这类问题。我的另一个答案有详细信息。您可以查看我的另一个答案:android.security.KeyStoreException: Invalid key blob

于 2016-06-01T15:21:42.623 回答