我的应用程序通过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();
}
}
答案 0 :(得分:1)
解决方案比我预期的要容易。
mContext = InstrumentationRegistry.getTargetContext();
发生安全异常是因为我使用getContext()
返回相对于包的上下文,其中getTargetContext()
返回相对于我的Receiver注册的整个应用程序的上下文。