【问题标题】:How to unit test Log.e in android?如何在android中对Log.e进行单元测试?
【发布时间】:2016-12-16 06:39:24
【问题描述】:

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

  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.

【问题讨论】:

    标签: android junit mockito powermockito android-log


    【解决方案1】:

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

    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 时,您基本上想查看 here (powermockito)here (powermock)。并且记录在案:下次尝试使用您最喜欢的搜索引擎。真的不是你是第一个问这个的人。

    【讨论】:

    • 非常感谢您的回复。我想先尝试选项 1。如何使用 PowerMockito 模拟它?你能分享一些代码吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 2022-11-17
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多