【问题标题】:Mocking PendingIntent instance and static within same test在同一测试中模拟 PendingIntent 实例和静态
【发布时间】:2017-10-08 00:43:44
【问题描述】:

我似乎无法弄清楚这一点。我得到java.lang.IncompatibleClassChangeError: Implementing class

我试图弄清楚如何通过将待处理的意图推送到组织类中来发送它。目前我有以下内容:

@RunWith(PowerMockRunner.class)
@PrepareForTest(PendingIntent.class)
public class TheTests{
    private Context _context;
    private AlarmManager _alarmManager;
    private Manager _manager;

    @Before
    public void setup() {
        _alarmManager = Mockito.mock(AlarmManager.class);
        _context = Mockito.mock(Context.class);
        Mockito.when(_context.getSystemService(anyString())).thenReturn(_alarmManager);
        _manager = new Manager(_context);
    }

    @Test
    public void example() {
        PendingIntent expected = PowerMockito.mock(PendingIntent.class);

        PowerMockito
                .when(PendingIntent.getBroadcast(any(Context.class), anyInt(), any(Intent.class), anyInt()))
                .thenReturn(expected);

        _manager.broadcast(_cal, new Schedule());
    }
}

public Manager class {
    public void broadcast(Thing thing) {
        if (thing == null) {
            return;
        }

        Intent sender = new Intent("broadcast.AlarmReceiverFilter");
        PendingIntent pendingIntent = PendingIntent.getBroadcast(_context, 0, sender, PendingIntent.FLAG_CANCEL_CURRENT);
        _alarm.set(AlarmManager.RTC_WAKEUP, 0, pendingIntent);
    }
}

在这一切之后,我想不出如何让它们都玩得很好。我的目标是验证 getBroadcast 中调用的内容以及 Intent 本身。

我应该采取什么方法?

谢谢, 凯莉

更新:建议在下面说话以避免powermock,所以我尝试了以下方法:

@Test
public void example2() {
    ShadowApplication shadowApp = shadowOf(RuntimeEnvironment.application);

    _manager = new TimeManager(shadowApp.getApplicationContext());
    _manager.broadcast(new Thing());

    List<Intent> intents = shadowApp.getBroadcastIntents();
    assertEquals(intents.size(), 1); // actual size is 0 (zero)
}

【问题讨论】:

  • 你能粘贴你的错误跟踪吗?

标签: android junit mockito robolectric powermockito


【解决方案1】:

我不会在这里使用PowerMock。

只需使用:

ShadowApplication shadowApp = shadowOf(RuntimeEnvironment.application);
List<Intent> intents = shadowApp.getBroadcastIntents();

然后在那里找到你的意图。

UPD。对不起,我没注意到你嘲笑AlarmManager。你不应该这样做并使用:

AlarmManager alarmManager = (AlarmManager)RuntimeEnvironment.application.getSystemService(Context.ALARM_SERVICE);
ShadowAlarmManager shadowAlarmManager = shadowOf(alarmManager);
List<ShadowAlarmManager.ScheduledAlarm> alarms = shadowAlarmManager.getScheduledAlarms();

【讨论】:

  • 您好 Eugen,谢谢您的建议。当我这样做时,似乎我没有收到任何广播。我将在上面讨论您的想法的代码中进行编辑。
  • 使用 AlarmManager 更新了答案。我建议从 Robolectric 潜入一些阴影。
  • 那是完美的@Eugen。谢谢你向我解释更多。同样感谢您帮助我了解shadow 课程的潜力(和选角)
猜你喜欢
  • 1970-01-01
  • 2019-04-04
  • 2020-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-27
  • 1970-01-01
相关资源
最近更新 更多