在同一测试中模拟 PendingIntent 实例和静态
Mocking PendingIntent instance and static within same test
我好像想不通。我得到 java.lang.IncompatibleClassChangeError: Implementing class
我正在尝试通过将待定意图推送到组织的 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)
}
我不会在这里使用PowerMock
。
只需使用:
ShadowApplication shadowApp = shadowOf(RuntimeEnvironment.application);
List<Intent> intents = shadowApp.getBroadcastIntents();
然后在那里找到你的意图。
更新。对不起,我没注意到你在嘲笑AlarmManager
。你不应该这样做并使用:
AlarmManager alarmManager = (AlarmManager)RuntimeEnvironment.application.getSystemService(Context.ALARM_SERVICE);
ShadowAlarmManager shadowAlarmManager = shadowOf(alarmManager);
List<ShadowAlarmManager.ScheduledAlarm> alarms = shadowAlarmManager.getScheduledAlarms();
我好像想不通。我得到 java.lang.IncompatibleClassChangeError: Implementing class
我正在尝试通过将待定意图推送到组织的 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)
}
我不会在这里使用PowerMock
。
只需使用:
ShadowApplication shadowApp = shadowOf(RuntimeEnvironment.application);
List<Intent> intents = shadowApp.getBroadcastIntents();
然后在那里找到你的意图。
更新。对不起,我没注意到你在嘲笑AlarmManager
。你不应该这样做并使用:
AlarmManager alarmManager = (AlarmManager)RuntimeEnvironment.application.getSystemService(Context.ALARM_SERVICE);
ShadowAlarmManager shadowAlarmManager = shadowOf(alarmManager);
List<ShadowAlarmManager.ScheduledAlarm> alarms = shadowAlarmManager.getScheduledAlarms();