【发布时间】:2016-12-08 19:02:36
【问题描述】:
我已经玩了几个星期了Espresso 测试,最后我决定开始测试 Fragments。
我马上遇到了一个问题,如何获取当前活动?
我的应用使用来自登录的数据,因此我无法使用测试规则启动活动。
简单来说,在做 espresso 测试的时候有没有类似getActivity() 的东西?
【问题讨论】:
标签: android android-testing ui-testing android-espresso
我已经玩了几个星期了Espresso 测试,最后我决定开始测试 Fragments。
我马上遇到了一个问题,如何获取当前活动?
我的应用使用来自登录的数据,因此我无法使用测试规则启动活动。
简单来说,在做 espresso 测试的时候有没有类似getActivity() 的东西?
【问题讨论】:
标签: android android-testing ui-testing android-espresso
我通常是这样理解的,它看起来(并且可能是)hacky 但是,嘿,它有效
import static android.support.test.InstrumentationRegistry.getInstrumentation;
public class MyTest {
private Activity getActivityInstance(){
final Activity[] currentActivity = {null};
getInstrumentation().runOnMainSync(new Runnable(){
public void run(){
Collection<Activity> resumedActivity = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED);
Iterator<Activity> it = resumedActivity.iterator();
currentActivity[0] = it.next();
}
});
return currentActivity[0];
}
}
【讨论】:
val activity = mActivityTestRule.getActivity() val idlingResource = ElapsedTimeIdlingResource(activity)
这里是lelloman's solution,在 Kotlin 中略有变化:
import android.app.Activity
import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
import androidx.test.runner.lifecycle.ActivityLifecycleMonitorRegistry
import androidx.test.runner.lifecycle.Stage
object EspressoHelper {
fun getCurrentActivity(): Activity? {
var currentActivity: Activity? = null
getInstrumentation().runOnMainSync { run { currentActivity = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED).elementAtOrNull(0) } }
return currentActivity
}
}
【讨论】: