如何在 android 中对 Log.e 进行单元测试?
How to unit test Log.e in android?
我需要执行单元测试,我需要检查当我的应用程序出现特定情况时是否记录了错误消息。
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.
有两种方法可以做到这一点:
- 你求助于 Powermock 或 Powermokito;因为那些模拟框架将允许您 mock/check 对 Log.e() 的静态调用。
- 您可以考虑更换静态调用。
示例:
interface LogWrapper {
public void e( whatever Log.e needs);
}
class LogImpl implements LogWrapper {
@Override
e ( whatever ) {
Log.e (whatever) ;
}
然后,您必须使用 依赖注入 使 LogWrapper
对象在您要记录的 类 中可用。对于正常的 "production" 用法,该对象只是 LogImpl
的一个实例;对于测试,您可以使用自己编写的 impl(跟踪发送给它的日志);或者您可以使用任何非强大的模拟框架(如 EasyMock 或 Mokito)来模拟它。然后你使用模拟框架的 checking/verification 方面来检查 "log was called with the expected parametes".
请注意:根据您的设置,选项 2 可能有点矫枉过正。但就我个人而言,我避免使用任何 Powermock;仅仅是因为我浪费了太多的时间来寻找 Powermock 的奇怪问题。我喜欢做覆盖测量;有时 Powermock 也会给你带来问题。
但是当你询问 Powermock 时,你基本上想看看 or here (powermock)。郑重声明:下次尝试使用您最喜欢的搜索引擎。你真的不是第一个问这个的人
我需要执行单元测试,我需要检查当我的应用程序出现特定情况时是否记录了错误消息。
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.
有两种方法可以做到这一点:
- 你求助于 Powermock 或 Powermokito;因为那些模拟框架将允许您 mock/check 对 Log.e() 的静态调用。
- 您可以考虑更换静态调用。
示例:
interface LogWrapper {
public void e( whatever Log.e needs);
}
class LogImpl implements LogWrapper {
@Override
e ( whatever ) {
Log.e (whatever) ;
}
然后,您必须使用 依赖注入 使 LogWrapper
对象在您要记录的 类 中可用。对于正常的 "production" 用法,该对象只是 LogImpl
的一个实例;对于测试,您可以使用自己编写的 impl(跟踪发送给它的日志);或者您可以使用任何非强大的模拟框架(如 EasyMock 或 Mokito)来模拟它。然后你使用模拟框架的 checking/verification 方面来检查 "log was called with the expected parametes".
请注意:根据您的设置,选项 2 可能有点矫枉过正。但就我个人而言,我避免使用任何 Powermock;仅仅是因为我浪费了太多的时间来寻找 Powermock 的奇怪问题。我喜欢做覆盖测量;有时 Powermock 也会给你带来问题。
但是当你询问 Powermock 时,你基本上想看看