3

我需要执行一个单元测试,我需要检查当我的应用程序中发生某种情况时是否记录了错误消息。

  try {
        //do something
    } catch (ClassCastException | IndexOutOfBoundsException e) {
        Log.e(INFOTAG, "Exception "+e.getMessage());
    }

我该如何测试呢?单元测试时出现以下错误。

Caused by: java.lang.RuntimeException: Method e in android.util.Log not mocked.
4

1 回答 1

3

有两种方法可以做到这一点:

  1. 你转向 Powermock 或 Powermokito;因为这些模拟框架将允许您模拟/检查对 Log.e() 的静态调用。
  2. 您可以考虑替换静态调用。

例子:

interface LogWrapper {
   public void e( whatever Log.e needs);
}

class LogImpl implements LogWrapper {
   @Override 
   e ( whatever ) { 
    Log.e (whatever) ; 
   }

然后,您必须使用依赖注入来使LogWrapper对象在您要记录的类中可用。对于正常的“生产”用法,该对象只是 ; 的一个实例LogImpl。对于测试,您可以使用自己编写的 impl(跟踪发送给它的日志);或者您可以使用任何非强大的模拟框架(如 EasyMock 或 Mokito)来模拟它。然后您使用模拟框架的检查/验证方面来检查“使用预期参数调用日志”。

请注意:根据您的设置,选项 2 可能是多余的。但就我个人而言,我避免使用 Powermock。仅仅是因为我浪费了太多时间来寻找 Powermock 的奇怪问题。我喜欢做覆盖率测量;有时 Powermock 也会给你带来问题。

但是当您询问 Powermock 时,您基本上想看这里 (powermockito)这里 (powermock)。并且记录在案:下次尝试使用您最喜欢的搜索引擎。这真的不像你是第一个问这个的人。

于 2016-08-10T04:07:32.303 回答