使用没有具体Activity.class的广播接收器进行集成测试

时间:2016-03-04 23:13:39

标签: android testing android-intent broadcastreceiver integration-testing

我的应用程序通过IntentFilters提供界面,供其他应用程序与之通信。

在内部我使用BroadcastReceivers将过滤后的Intent转换为POJO并将它们发布到我的EventBus(Greenrobot v3)中。

我的问题:
我将ActivityTestRule与存根MainActivity.class - 文件结合使用以获得Context,我可以在其上注册BroadcastReceiver并发送Intent s:

mContext = mActivityRule.getContext();

我真的想在哪里使用某种“匿名活动”。所以我可以摆脱我的Stub MainActivity.class文件。我试着用:

mContext = InstrumentationRegistry.getContext();

但是一旦我注册了我的接收器,测试就会抛出java.lang.SecurityException。有办法绕过这个例外吗?

这是我的TestCase的骨架:

@MediumTest
@RunWith(AndroidJUnit4.class)
public class StackoverflowQuestionTest {

    @Rule
    public ActivityTestRule<MainActivity> mActivityRule 
        = new ActivityTestRule<>(MainActivity.class);

    Person mPerson;
    CountDownLatch mLock;
    mContext = mActivityRule.getActivity();

    @Before
    public void setUp() {
        mLock = new CountDownLatch(1);
        mPerson = null;

        PersonReceiver receiver = new PersonReceiver();
        IntentFilter filter = receiver.getPredefinedFilter();
        mContext.registerReceiver(receiver, filter);
    }

    @Test
    public void PersonReceiver_seats_a_Person_on_the_EventBus() throws InterruptedException {
        EventBus.getDefault().register(this);

        mContext.sendBroadcast(new MockedPersonIntent("Waldo"));

        mLock.await();

        assertThat(Person.getName(), is(equalTo("Waldo")));
    }

    @Subscribe
    public void onPerson(Person person) {
        Person = person;
        mLock.countDown();
    }
}

1 个答案:

答案 0 :(得分:1)

解决方案比我预期的要容易。

mContext = InstrumentationRegistry.getTargetContext();

发生安全异常是因为我使用getContext()返回相对于包的上下文,其中getTargetContext()返回相对于我的Receiver注册的整个应用程序的上下文。

正如Documentation

中所述