espresso time idler 的行为如何?
How does espresso time idler behave?
我正在使用 blog 中提到的上述技术,但是我注意到它不会等待我尝试设置的所需 15 秒。我的问题是,如果所有后端任务在 15 秒之前完成,espresso 是否会识别它并开始下一个连续操作?对此的任何线索表示赞赏。
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;
}
}
==
long waitingTime = DateUtils.MINUTE_IN_MILLIS / 4;
IdlingPolicies.setMasterPolicyTimeout(
waitingTime * 2, TimeUnit.MILLISECONDS);
IdlingPolicies.setIdlingResourceTimeout(
waitingTime * 2, TimeUnit.MILLISECONDS);
IdlingResource idlingResource
= new ElapsedTimeIdlingResource(waitingTime);
Espresso.registerIdlingResources(idlingResource);
您需要 运行 一个 Espresso 命令,任何 Espresso 命令,紧跟 registerIdlingResources()
。我在我自己的 PC 上创建了这个示例单元测试,它工作正常。
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Rule public ActivityTestRule<MainActivity> rule = new ActivityTestRule<>(MainActivity.class);
private final long waitingTime = DateUtils.MINUTE_IN_MILLIS / 4;
@Before public void setUp() {
IdlingPolicies.setMasterPolicyTimeout(waitingTime * 2, TimeUnit.MILLISECONDS);
IdlingPolicies.setIdlingResourceTimeout(waitingTime * 2, TimeUnit.MILLISECONDS);
}
@Test public void useAppContext() throws Exception {
IdlingResource idlingResource = new ElapsedTimeIdlingResource(waitingTime);
Espresso.registerIdlingResources(idlingResource);
onView(withId(R.id.btnStart)).perform(click());
Espresso.unregisterIdlingResources(idlingResource);
assertTrue(true);
}
}
在我的示例中,我有一个名为 btnStart
的按钮,我点击它,但它可以是与您的应用程序相关的任何内容。让我知道这是否适合你。
并在评论中直接回答您的其他问题:
isIdleNow()
在 Idling 资源注册后不断被 Espresso 轮询。当 idle
为 true
时,这是 Espresso 继续执行下一个命令 的信号。如果你想阻止,你需要 isIdleNow()
到 return false
。
- 在这种特定情况下,不,空闲资源完全基于时间,而不是后台进程的状态,但是您可以创建轮询状态的空闲资源运行宁threads/processes。除非您的进程通过关闭 activity 结束,否则 Espresso 将等待,但只会阻止 自身 (例如
ViewMatchers
、点击等),不会阻止任何其他线程。 activity 将继续正常运行。
我正在使用 blog 中提到的上述技术,但是我注意到它不会等待我尝试设置的所需 15 秒。我的问题是,如果所有后端任务在 15 秒之前完成,espresso 是否会识别它并开始下一个连续操作?对此的任何线索表示赞赏。
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;
}
}
==
long waitingTime = DateUtils.MINUTE_IN_MILLIS / 4;
IdlingPolicies.setMasterPolicyTimeout(
waitingTime * 2, TimeUnit.MILLISECONDS);
IdlingPolicies.setIdlingResourceTimeout(
waitingTime * 2, TimeUnit.MILLISECONDS);
IdlingResource idlingResource
= new ElapsedTimeIdlingResource(waitingTime);
Espresso.registerIdlingResources(idlingResource);
您需要 运行 一个 Espresso 命令,任何 Espresso 命令,紧跟 registerIdlingResources()
。我在我自己的 PC 上创建了这个示例单元测试,它工作正常。
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Rule public ActivityTestRule<MainActivity> rule = new ActivityTestRule<>(MainActivity.class);
private final long waitingTime = DateUtils.MINUTE_IN_MILLIS / 4;
@Before public void setUp() {
IdlingPolicies.setMasterPolicyTimeout(waitingTime * 2, TimeUnit.MILLISECONDS);
IdlingPolicies.setIdlingResourceTimeout(waitingTime * 2, TimeUnit.MILLISECONDS);
}
@Test public void useAppContext() throws Exception {
IdlingResource idlingResource = new ElapsedTimeIdlingResource(waitingTime);
Espresso.registerIdlingResources(idlingResource);
onView(withId(R.id.btnStart)).perform(click());
Espresso.unregisterIdlingResources(idlingResource);
assertTrue(true);
}
}
在我的示例中,我有一个名为 btnStart
的按钮,我点击它,但它可以是与您的应用程序相关的任何内容。让我知道这是否适合你。
并在评论中直接回答您的其他问题:
isIdleNow()
在 Idling 资源注册后不断被 Espresso 轮询。当idle
为true
时,这是 Espresso 继续执行下一个命令 的信号。如果你想阻止,你需要isIdleNow()
到 returnfalse
。- 在这种特定情况下,不,空闲资源完全基于时间,而不是后台进程的状态,但是您可以创建轮询状态的空闲资源运行宁threads/processes。除非您的进程通过关闭 activity 结束,否则 Espresso 将等待,但只会阻止 自身 (例如
ViewMatchers
、点击等),不会阻止任何其他线程。 activity 将继续正常运行。