2017-10-08 63 views
1

我似乎無法弄清楚這一點。我得到java.lang.IncompatibleClassChangeError: Implementing class嘲笑PendingIntent實例和同一測試中的靜態

我想弄清楚如何發送一個掛起的意圖,通過推入一個組織的類。目前,我有以下幾點:

@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) 
} 
+0

你可以粘貼你的錯誤跟蹤。 –

回答

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(); 
+0

嗨歐根,謝謝你的建議。我這樣做似乎沒有得到任何廣播。我將在上面的代碼中對您的想法進行編輯。 – KellyTheDev

+0

使用AlarmManager更新答案。我建議潛入Robolectric的陰影。 –

+0

這完美@Eugen。謝謝你向我解釋更多。同樣感謝您幫助我理解「陰影」類的潛力(和演員) – KellyTheDev