在我的测试用例中,我必须记录1小时,在机器人solo.sleep(600000)完成了我的工作,但在espresso我感到困惑IdlingResource的概念.我必须开始录音并等待一段时间(取决于测试的类型)15分钟,60分钟等
机器人中的等效代码
solo.clickOnView(solo.getView("start_record")); solo.sleep(duration * 60 * 1000); solo.clickOnView(solo.getView("stop_record"));
我尝试在espresso中使用它
@RunWith(AndroidJUnit4.class) @SmallTest public class AaEspressoTest { private static final String LAUNCHER_ACTIVITY_FULL_CLASSNAME = "com.absd.rec.RecorderActivity"; private static Class<?> launcherActivityClass; private Solo solo; private static CoreRecordingTest skyroTestRunner; private static Class<? extends Activity> activityClass; static { try { activityClass = (Class<? extends Activity>) Class.forName(LAUNCHER_ACTIVITY_FULL_CLASSNAME); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } } @Rule public final ActivityTestRule<?> activityRule = new ActivityTestRule<>(activityClass); private IntentServiceIdlingResource idlingResource; @Before public void registerIntentServiceIdlingResource() { Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); idlingResource = new IntentServiceIdlingResource(instrumentation.getTargetContext()); Espresso.registerIdlingResources(idlingResource); } @After public void unregisterIntentServiceIdlingResource() { Espresso.unregisterIdlingResources(idlingResource); } @Test public void testHello() throws Exception { onView(withId(AaEspressoTest.getId("recorderpage_record"))).perform(click()); registerIntentServiceIdlingResource(); onView(withId(AaEspressoTest.getId("recorderpage_stop"))).perform(click()); } }
空闲资源
public class IntentServiceIdlingResource implements IdlingResource { private final Context context; private ResourceCallback resourceCallback; public static boolean status = false; public IntentServiceIdlingResource(Context context) { this.context = context; } @Override public String getName() { return IntentServiceIdlingResource.class.getName(); } @Override public boolean isIdleNow() { return getTimer(); } @Override public void registerIdleTransitionCallback(ResourceCallback resourceCallback) { this.resourceCallback = resourceCallback; } private static boolean getTimer() { new CountDownTimer(5000,1000) { @Override public void onTick(long millisUntilFinished) { // Do Nothing status = false; } @Override public void onFinish() { status = true; } }; return status; } }
例外:
android.support.test.espresso.IdlingResourceTimeoutException: Wait for [com.adbs.recorder.IntentServiceIdlingResource] to become idle timed out
解决方法
您需要一个具有isIdleNow()的IdlingResource,只有在特定的时间量过去时才返回true.为了达到这个目的,保存开始时间并与当前时间进行比较:
public class ElapsedTimeIdlingResource implements IdlingResource { private final long startTime; private final long waitingTime; private ResourceCallback resourceCallback; public ElapsedTimeIdlingResource(long waitingTime) { this.startTime = System.currentTimeMillis(); this.waitingTime = waitingTime; } @Override public String getName() { return ElapsedTimeIdlingResource.class.getName() + ":" + waitingTime; } @Override public boolean isIdleNow() { long elapsed = System.currentTimeMillis() - startTime; boolean idle = (elapsed >= waitingTime); if (idle) { resourceCallback.onTransitionToIdle(); } return idle; } @Override public void registerIdleTransitionCallback( ResourceCallback resourceCallback) { this.resourceCallback = resourceCallback; } }
在测试中创建并注册此空闲资源:
@Test public static void waitForOneHour() { long waitingTime = DateUtils.HOUR_IN_MILLIS; // Start onView(withId(AaEspressoTest.getId("recorderpage_record"))) .perform(click()); // Make sure Espresso does not time out IdlingPolicies.setMasterPolicyTimeout( waitingTime * 2,TimeUnit.MILLISECONDS); IdlingPolicies.setIdlingResourceTimeout( waitingTime * 2,TimeUnit.MILLISECONDS); // Now we wait IdlingResource idlingResource = new ElapsedTimeIdlingResource(waitingTime); Espresso.registerIdlingResources(idlingResource); // Stop onView(withId(AaEspressoTest.getId("recorderpage_stop"))) .perform(click()); // Clean up Espresso.unregisterIdlingResources(idlingResource); }
您需要setMasterPolicyTimeout和setIdlingResourceTimeout调用,以确保Espresso由于超时而不会终止测试.
完整例子:https://github.com/chiuki/espresso-samples/tree/master/idling-resource-elapsed-time