gpt4 book ai didi

android - 单元测试 : NoSuchMethodError while calling Notification. setLatestEventInfo()

转载 作者:搜寻专家 更新时间:2023-11-01 08:40:55 26 4
gpt4 key购买 nike

Feel free to improve the title I'm a little uncreative in this special case.

我正在实现一个单元测试来检查通知,我知道这几乎不可能,但我想检查我能在多大程度上自动化它。

我无法测试这行简单的代码:

Notification test = new NotificationCompat.Builder(context).build();

原因很愚蠢,也很简单。此处的代码将在内部执行:

public Notification build(Builder b, BuilderExtender extender) {
Notification result = b.mNotification;
result.setLatestEventInfo(b.mContext, b.mContentTitle,
b.mContentText, b.mContentIntent);
[...]

我遇到了这个异常:

Caused by: java.lang.NoSuchMethodError: android.app.Notification.setLatestEventInfo(Landroid/content/Context;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Landroid/app/PendingIntent;)V
at android.support.v4.app.NotificationCompat$NotificationCompatImplBase.build(NotificationCompat.java:479)
at android.support.v4.app.NotificationCompat$Builder.build(NotificationCompat.java:1561)

不难猜测,Google 人员在这里调用了一个在 Android Marshmallow SDK 中被删除(或更恰本地用 @hide 注释)的方法。我已经验证调用缺少最新的文档,但它是在 API 1 AFIK 中引入的。

我该如何解决这个问题?

我尝试过但卡住了的事情:

  • 覆盖回调,并在不调用该调用的情况下模拟该方法:
    我设法得到了 Class<?>使用回调,但我可以使用哪种方法覆盖孔方法?我的意思是我需要修补调用它我不能只是模拟它。
  • 注入(inject)该调用,但如何注入(inject)?我可以只覆盖它而不添加它。
  • 通过以下方式抑制调用:

    PowerMockito.spy(Notification.class);
    PowerMockito.suppress(PowerMockito.method(Notification.class, "setLatestEventInfo", Context.class, CharSequence.class, CharSequence.class, PendingIntent.class));

    因为我尝试踢一个不存在的方法,所以以太币不起作用。

  • 更改此测试的目标 SDK,但我该怎么做?

最佳答案

解决方案比预期的要容易。我错过了默认情况下 Build.VERSION.SDK_INT 的值 0 因为它无法读取实际值。因此支持库仅在存在此方法的平台上调用它。

this answer的帮助下.我只需要添加这段代码:

setFinalStatic(Build.VERSION.class.getDeclaredField("SDK_INT"), 23);

我的代码有效。
好吧它仍然在其他地方崩溃,但是创建了通知。哇哦!

和实际功能:

public static void setFinalStatic(Field field, Object newValue) throws IllegalAccessException, NoSuchFieldException
{
field.setAccessible(true);
// remove final modifier from field
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(null, newValue);
}

关于android - 单元测试 : NoSuchMethodError while calling Notification. setLatestEventInfo(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32779890/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com