java - 如何为未捕获的线程异常处理程序编写单元测试。

标签 java android unit-testing junit uncaught-exception

我正在尝试为我的应用程序编写未捕获线程异常处理程序的单元测试,但到目前为止运气不佳。处理程序是应用程序范围的,我知道它有效。它还基于找到的代码 here .但是我想不出一种方法来实际为它编写单元测试,考虑到如果我从我的测试项目中抛出异常它正在输入该代码,但它永远不会返回。这会导致我迄今为止编写的所有测试都失败。

这是我的处理程序,有人对我如何对其进行单元测试有任何建议吗?

public class MyApplication extends Application {
    // uncaught exception handler variable
    private final UncaughtExceptionHandler defaultUEH;
    // handler listener
    private final Thread.UncaughtExceptionHandler _unCaughtExceptionHandler = new Thread.UncaughtExceptionHandler() {
        @Override
        public void uncaughtException(Thread thread, Throwable ex) {

            // Try restarting the application if an uncaught exception has
            // occurred.
            PendingIntent myActivity = PendingIntent
                    .getActivity(getApplicationContext(), 192837, new Intent(
                            getApplicationContext(), MainGui.class), PendingIntent.FLAG_ONE_SHOT);

            AlarmManager alarmManager;
            alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
            alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 15000, myActivity);
            System.exit(2);

            // re-throw critical exception further to the os (important)
            defaultUEH.uncaughtException(thread, ex);

        }
    };

    public MyApplication() {
        defaultUEH = Thread.getDefaultUncaughtExceptionHandler();

        // setup handler for uncaught exception
        Thread.setDefaultUncaughtExceptionHandler(_unCaughtExceptionHandler);
    }

我的包含测试的项目与我的实际应用程序项目是分开的。我已经尝试在代码中设置标志,但是在调用异常之后,我的测试已经失败并且没有机会检查是否已设置标志。我想过可能在未捕获的异常处理程序中添加一个广播并触发它,或者可能使用首选项并以某种方式重新运行测试以检查首选项是否已更改,但这并不是很可靠,我想如果可能的话,避免为了测试而插入太多额外代码。

谢谢!

最佳答案

我猜你的测试框架正在捕获所有异常(junit 这样做),所以 UncaughtExceptionHandler 永远不会被调用。

但是,如果您运行启动新线程的测试,则框架不应捕获该线程中的异常。例如:

public void testUncaughtExceptionhandler()
{
  Thread testThread = new Thread()
  {
    public void run()
    {
      throw new RuntimeException("Expected!");
    }
  };

  testThread.start();
  testThread.join();
}

这应该会成功抛出一个异常,该异常会被 UncaughtExceptionHandler 捕获。

这是在测试是否在正确的时间调用了 UncaughtExceptionHandler。要测试处理程序是否正确响应,您只需调用:

_unCaughtExceptionHandler.uncaughtException(thread, ex);

将一个 Thread 和一个 Throwable 传递给它。这将测试处理程序在运行时是否会正确运行。\

这两个测试验证设置默认处理程序的代码是否正确以及处理程序本身是否正确。这些是不同的问题,测试两者很有用。

我突然想到 junit 可能依赖于使用它自己的 UncaughtExceptionHandler,所以当你覆盖它时,你破坏了框架。如果是这种情况,您可能需要在不使用 junit 的情况下构建和运行测试。

关于java - 如何为未捕获的线程异常处理程序编写单元测试。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23481352/

相关文章:

java - Google plus-cmdline-示例

java - 动态转换为对象 ArrayList 中未知的类

c# - 单元测试组织

java - 在 Play 框架中将 Promise 列表转换为 List 的 Promise

java - revalidate() 和 repaint() 没有更新我的 JPanel

android - 在 Gradle 产品 flavor 上调试签名配置

android - 如何以米为单位测量 Google map 的相机视口(viewport)?

android - Google Play Services Analytics 库实现导致 Play Console 广告警告

java - 我们可以在测试服务本身的同时模拟服务中的方法吗?

python - 如何模拟 python dict __str__ 方法?