如何从 ActivityScenarioRule 访问 Activity
How to Access Activity from ActivityScenarioRule
我正在使用 ActivityScenarioRule
进行 Espresso UI 测试,我想访问方法 getStringArray()
,调用它需要 Activity
。那么,有什么方法可以通过 ActivityScenarioRule
检索 Activity
,可能类似于 ActivityTestRule
.
中的 getActivity
@Rule
public ActivityScenarioRule activityScenarioRule = new ActivityScenarioRule<>(MainActivity.class);
我没有使用 ActivityTestRule
,因为它已被弃用!
由于您似乎正在使用 Java,因此您可以这样做:
@Rule
ActivityScenarioRule<MainActivity> activityScenarioRule = new ActivityScenarioRule<>(MainActivity.class);
@Test
public void test() {
activityScenarioRule.getScenario().onActivity(activity -> {
// use 'activity'.
});
}
请阅读 documentation 以了解有关这些与正在测试的 activity 进行交互的新方法的更多信息。
一种相当直接的Java获取方式:
private ActivityScenario mActivityScenario;
@After
public void tearDown() throws Exception {
if (mActivityScenario != null) {
mActivityScenario.close();
}
mActivityScenario = null;
}
@Override
public Activity getActivity() {
if (mActivityScenario == null) {
mActivityScenario = ActivityScenario.launch(getActivityClassForScenario());
}
return tryAcquireScenarioActivity(mActivityScenario);
}
protected static Activity tryAcquireScenarioActivity(ActivityScenario activityScenario) {
Semaphore activityResource = new Semaphore(0);
Activity[] scenarioActivity = new Activity[1];
activityScenario.onActivity(activity -> {
scenarioActivity[0] = activity;
activityResource.release();
});
try {
activityResource.tryAcquire(15000, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
Assert.fail("Failed to acquire activity scenario semaphore");
}
Assert.assertNotNull("Scenario Activity should be non-null", scenarioActivity[0]);
return scenarioActivity[0];
}
Espresso 陈述如下:
At the same time, the framework prevents direct access to activities
and views of the application because holding on to these objects and
operating on them off the UI thread is a major source of test
flakiness.
当没有其他方法时,我使用以下方法从 ActivityScenarioRule 中获取任意 activity。它使用接受的答案中提到的onActivity:
private <T extends Activity> T getActivity(ActivityScenarioRule<T> activityScenarioRule) {
AtomicReference<T> activityRef = new AtomicReference<>();
activityScenarioRule.getScenario().onActivity(activityRef::set);
return activityRef.get();
}
onView(...) onActivity 中的任何代码导致我的测试用例超时。因此,我提取了 activity 并在 onActivity 之外成功使用了它。当心寿!参见上面的声明。
@Test
fun checkForUpdate() {
val scenario = ActivityScenario.launch(MainActivity::class.java)
scenario.onActivity {
UpdateTool.checkForUpdate(it)
}
}
我正在使用 ActivityScenarioRule
进行 Espresso UI 测试,我想访问方法 getStringArray()
,调用它需要 Activity
。那么,有什么方法可以通过 ActivityScenarioRule
检索 Activity
,可能类似于 ActivityTestRule
.
getActivity
@Rule
public ActivityScenarioRule activityScenarioRule = new ActivityScenarioRule<>(MainActivity.class);
我没有使用 ActivityTestRule
,因为它已被弃用!
由于您似乎正在使用 Java,因此您可以这样做:
@Rule
ActivityScenarioRule<MainActivity> activityScenarioRule = new ActivityScenarioRule<>(MainActivity.class);
@Test
public void test() {
activityScenarioRule.getScenario().onActivity(activity -> {
// use 'activity'.
});
}
请阅读 documentation 以了解有关这些与正在测试的 activity 进行交互的新方法的更多信息。
一种相当直接的Java获取方式:
private ActivityScenario mActivityScenario;
@After
public void tearDown() throws Exception {
if (mActivityScenario != null) {
mActivityScenario.close();
}
mActivityScenario = null;
}
@Override
public Activity getActivity() {
if (mActivityScenario == null) {
mActivityScenario = ActivityScenario.launch(getActivityClassForScenario());
}
return tryAcquireScenarioActivity(mActivityScenario);
}
protected static Activity tryAcquireScenarioActivity(ActivityScenario activityScenario) {
Semaphore activityResource = new Semaphore(0);
Activity[] scenarioActivity = new Activity[1];
activityScenario.onActivity(activity -> {
scenarioActivity[0] = activity;
activityResource.release();
});
try {
activityResource.tryAcquire(15000, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
Assert.fail("Failed to acquire activity scenario semaphore");
}
Assert.assertNotNull("Scenario Activity should be non-null", scenarioActivity[0]);
return scenarioActivity[0];
}
Espresso 陈述如下:
At the same time, the framework prevents direct access to activities and views of the application because holding on to these objects and operating on them off the UI thread is a major source of test flakiness.
当没有其他方法时,我使用以下方法从 ActivityScenarioRule 中获取任意 activity。它使用接受的答案中提到的onActivity:
private <T extends Activity> T getActivity(ActivityScenarioRule<T> activityScenarioRule) {
AtomicReference<T> activityRef = new AtomicReference<>();
activityScenarioRule.getScenario().onActivity(activityRef::set);
return activityRef.get();
}
onView(...) onActivity 中的任何代码导致我的测试用例超时。因此,我提取了 activity 并在 onActivity 之外成功使用了它。当心寿!参见上面的声明。
@Test
fun checkForUpdate() {
val scenario = ActivityScenario.launch(MainActivity::class.java)
scenario.onActivity {
UpdateTool.checkForUpdate(it)
}
}