gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 20:40:29 26 4
gpt4 key购买 nike

我的应用程序通过 IntentFilters 提供了一个接口(interface),供其他应用程序与之通信。

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

我的问题:
我将 ActivityTestRule 与 stub MainActivity.class - File 结合使用以获取 Context,我可以在其上注册我的 BroadcastReceiver 并发送 Intent :

mContext = mActivityRule.getContext();

我真的很想使用某种“匿名 Activity ”。这样我就可以摆脱我的 Stub MainActivity.class 文件。我尝试使用:

mContext = InstrumentationRegistry.getContext();

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

这是我的测试用例的骨架:

@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();
}
}

最佳答案

解决方案比我预期的要简单。

mContext = InstrumentationRegistry.getTargetContext();

发生安全异常是因为我使用了 getContext(),它返回一个相对于包的上下文,而 getTargetContext() 返回一个相对于整个应用程序的上下文,它也我的接收器注册到。

完全如 Documentation 中所述

关于android - 使用没有具体 Activity.class 的广播接收器进行集成测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35807785/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com