Android 模拟同一测试中的悬而未决实例和静态

Android 模拟同一测试中的悬而未决实例和静态,android,junit,mockito,robolectric,powermockito,Android,Junit,Mockito,Robolectric,Powermockito,我似乎无法理解这一点。我得到java.lang.CompatibleClassChangeError:实现类 我正试图找出如何发送一个挂起的意图,方法是将它推送到一个类中供组织使用。目前我有以下几点: @RunWith(PowerMockRunner.class) @PrepareForTest(PendingIntent.class) public class TheTests{ private Context _context; private AlarmManager _a

我似乎无法理解这一点。我得到
java.lang.CompatibleClassChangeError:实现类

我正试图找出如何发送一个挂起的意图,方法是将它推送到一个类中供组织使用。目前我有以下几点:

@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);
    }
}
@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)
}
在这一切之后,我不知道如何让他们都玩得很好。我的目标是验证
getBroadcast
中调用的内容,以及
Intent
本身

我应该采取什么方法

谢谢, 凯利

更新:下面讨论建议避免使用powermock,因此我尝试了以下方法:

@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);
    }
}
@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)
}
@测试
公共无效示例2(){
ShadowApplication shadowApp=shadowOf(RuntimeEnvironment.application);
_manager=newtimemanager(shadowApp.getApplicationContext());
_广播经理(新事物);
List intents=shadowApp.getBroadcastIntents();
assertEquals(intents.size(),1);//实际大小为0(零)
}

我不会在这里使用
PowerMock

只需使用:

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

你能粘贴你的错误跟踪吗?嗨,欧根,谢谢你的建议。当我这样做的时候,我似乎没有得到任何广播。我将对上面的代码进行编辑,讨论您的想法。使用AlarmManager更新答案。我建议从“机器人分子”潜入一些阴影中。这太完美了@Eugen。谢谢你多给我解释一下。同样感谢您帮助我理解
shadow
类的潜力(和施法)