Java Android Espresso IdlingPolicys.setIdlingResourceTimeout不工作

Java Android Espresso IdlingPolicys.setIdlingResourceTimeout不工作,java,android,android-espresso,Java,Android,Android Espresso,我有几个类来测试深层链接。每个类测试1个深度链接 当我单独运行它们时,很少有测试总是在10秒以上正确终止,但当我一起运行它们时,总是需要45秒以上才能完成 请注意,所有这些测试现在都应该失败(我还没有为它们完成实现),因此结果应该不会变化 我是否使用了IdlingPolicies.setidlingsourcetimeout错误 我的测试班: @RunWith(AndroidJUnit4.class) public class DeepLinkActivityBagTest extends M

我有几个类来测试深层链接。每个类测试1个深度链接

当我单独运行它们时,很少有测试总是在10秒以上正确终止,但当我一起运行它们时,总是需要45秒以上才能完成


请注意,所有这些测试现在都应该失败(我还没有为它们完成实现),因此结果应该不会变化

我是否使用了
IdlingPolicies.setidlingsourcetimeout
错误

我的测试班:

@RunWith(AndroidJUnit4.class)
public class DeepLinkActivityBagTest extends MyActivityTest {

    @Rule
    public MyActivityTestRule<DeepLinkActivity> activityTestRule =
            new MyActivityTestRule<DeepLinkActivity>(DeepLinkActivity.class) {
                @Override
                protected Intent getActivityIntent() {
                    Intent intent = super.getActivityIntent();
                    intent.setAction(Intent.ACTION_VIEW);
                    intent.setData(Uri.parse("xxx://bag"));
                    return intent;
                }
            };

    @Test
    public void testCorrectScreenOpened() {
        setUpWait();

        String expectedToolbarTitle = "shopping bag" + mToolbarTitleSuffix;
        onView(withTextIgnoreCase(expectedToolbarTitle)).check(matches(isDisplayed()));
    }
}
@RunWith(AndroidJUnit4.class)
public class MyActivityTest {
    @Rule
    public MyActivityTestRule<DeepLinkActivity> activityTestRule;
    protected String mToolbarTitleSuffix;

    @Before
    public void prepare() {
        if (!BuildConfig.FLAVOR.equals(ENV_PRODUCTION)) {
            mToolbarTitleSuffix = String.format(" (%s)", BuildConfig.FLAVOR);
        }
    }

    @After
    public void resetCountry() {
        if (activityTestRule != null) {
            PrefUtils.clear(InstrumentationRegistry.getTargetContext());
            PrefUtils.setCurrentCountryCode(activityTestRule.getmCurCountryCode());
            PrefUtils.setCurrentLangCode(activityTestRule.getmCurLangCode());
        }
    }

    protected void setUpWait() {
        try {
            Thread.sleep(3 * 1000);
        } catch (InterruptedException e) {
            Logger.e(e, "");
        }
        IdlingPolicies.setMasterPolicyTimeout(10, TimeUnit.SECONDS);
        IdlingPolicies.setIdlingResourceTimeout(5, TimeUnit.SECONDS);
    }
}
@RunWith(AndroidJUnit4.class)
公共类DeepLinkActivityBagTest扩展了MyActivityTest{
@统治
公共MyActivityTestRule activityTestRule=
新的MyActivityTestRule(DeepLinkActivity.class){
@凌驾
受保护的意图getActivityIntent(){
Intent-Intent=super.getActivityIntent();
intent.setAction(intent.ACTION\u视图);
intent.setData(Uri.parse(“xxx://bag"));
返回意图;
}
};
@试验
公开作废testCorrectScreenOpened(){
setUpWait();
字符串expectedToolbarTitle=“购物袋”+mToolbarTitleSuffix;
onView(使用TextIgnoreCase(expectedToolbarTitle))。检查(匹配项(isDisplayed()));
}
}
其父类:

@RunWith(AndroidJUnit4.class)
public class DeepLinkActivityBagTest extends MyActivityTest {

    @Rule
    public MyActivityTestRule<DeepLinkActivity> activityTestRule =
            new MyActivityTestRule<DeepLinkActivity>(DeepLinkActivity.class) {
                @Override
                protected Intent getActivityIntent() {
                    Intent intent = super.getActivityIntent();
                    intent.setAction(Intent.ACTION_VIEW);
                    intent.setData(Uri.parse("xxx://bag"));
                    return intent;
                }
            };

    @Test
    public void testCorrectScreenOpened() {
        setUpWait();

        String expectedToolbarTitle = "shopping bag" + mToolbarTitleSuffix;
        onView(withTextIgnoreCase(expectedToolbarTitle)).check(matches(isDisplayed()));
    }
}
@RunWith(AndroidJUnit4.class)
public class MyActivityTest {
    @Rule
    public MyActivityTestRule<DeepLinkActivity> activityTestRule;
    protected String mToolbarTitleSuffix;

    @Before
    public void prepare() {
        if (!BuildConfig.FLAVOR.equals(ENV_PRODUCTION)) {
            mToolbarTitleSuffix = String.format(" (%s)", BuildConfig.FLAVOR);
        }
    }

    @After
    public void resetCountry() {
        if (activityTestRule != null) {
            PrefUtils.clear(InstrumentationRegistry.getTargetContext());
            PrefUtils.setCurrentCountryCode(activityTestRule.getmCurCountryCode());
            PrefUtils.setCurrentLangCode(activityTestRule.getmCurLangCode());
        }
    }

    protected void setUpWait() {
        try {
            Thread.sleep(3 * 1000);
        } catch (InterruptedException e) {
            Logger.e(e, "");
        }
        IdlingPolicies.setMasterPolicyTimeout(10, TimeUnit.SECONDS);
        IdlingPolicies.setIdlingResourceTimeout(5, TimeUnit.SECONDS);
    }
}
@RunWith(AndroidJUnit4.class)
公共类MyActivityTest{
@统治
公共MyActivityTestRule activityTestRule;
受保护字符串mToolbarTitleSuffix;
@以前
公众假期准备(){
如果(!BuildConfig.FLAVOR.equals(ENV_PRODUCTION)){
mToolbarTitleSuffix=String.format((%s)”,BuildConfig.FLAVOR);
}
}
@之后
公共资源(国家){
if(activityTestRule!=null){
clear(InstrumentationRegistry.getTargetContext());
setCurrentCountryCode(activityTestRule.getmCurCountryCode());
setCurrentLangCode(activityTestRule.getmCurLangCode());
}
}
受保护的void setUpWait(){
试一试{
线程。睡眠(3*1000);
}捕捉(中断异常e){
e(e)"",;
}
IdlingPolicys.setMasterPolicyTimeout(10,时间单位为秒);
IdlingPolicys.setIdlingResourceTimeout(5,时间单位秒);
}
}
MyActivityTestRule:

public class MyActivityTestRule<D extends Activity> extends ActivityTestRule {
    private String mCurCountryCode;
    private String mCurLangCode;

    protected MyActivityTestRule(Class activityClass) {
        super(activityClass);
    }

    public MyActivityTestRule(Class activityClass, boolean initialTouchMode) {
        super(activityClass, initialTouchMode);
    }

    public MyActivityTestRule(Class activityClass, boolean initialTouchMode, boolean launchActivity) {
        super(activityClass, initialTouchMode, launchActivity);
    }

    @Override
    protected void beforeActivityLaunched() {
        super.beforeActivityLaunched();

        PrefUtils.setup(InstrumentationRegistry.getTargetContext());
        mCurCountryCode = PrefUtils.getCurrentCountryCode();
        mCurLangCode = PrefUtils.getCurrentLangCode();
        PrefUtils.clear(InstrumentationRegistry.getTargetContext());
        PrefUtils.setCurrentCountryCode("SG");
        PrefUtils.setCurrentLangCode("en");
    }

    String getmCurCountryCode() {
        return mCurCountryCode;
    }

    String getmCurLangCode() {
        return mCurLangCode;
    }
}
公共类MyActivityTestRule扩展ActivityTestRule{
私有字符串mCurCountryCode;
私有字符串mCurLangCode;
受保护的MyActivityTestRule(类activityClass){
超级(活动类);
}
公共MyActivityTestRule(类activityClass,布尔初始接触模式){
超级(activityClass,initialTouchMode);
}
公共MyActivityTestRule(类activityClass、布尔initialTouchMode、布尔启动活动){
超级(activityClass、initialTouchMode、launchActivity);
}
@凌驾
在ActivityLaunched()之前受保护的空{
super.beforeActivityLaunched();
setup(InstrumentationRegistry.getTargetContext());
mCurCountryCode=PrefUtils.getCurrentCountryCode();
mCurLangCode=PrefUtils.getCurrentLangCode();
clear(InstrumentationRegistry.getTargetContext());
PrefUtils.setCurrentCountryCode(“SG”);
序言.设置当前语言代码(“en”);
}
字符串getmCurCountryCode(){
返回mCurCountryCode;
}
字符串getmCurLangCode(){
返回mCurLangCode;
}
}

您知道您的测试不是孤立的吗
activityTestRule
from
DeepLinkActivityBagTest
涵盖了
MyActivityTest
中的
activityTestRule
,这使得
@After
方法始终不调用任何内容?另外,45秒是相当长的一段时间,因此请仔细检查您的日志,这肯定会告诉您更多。如果您以错误的方式使用IdlingResource,请检查此项。如果没有失败测试的日志,则回答问题很有挑战性。正如@R.Zagórski所指出的,您可能正在处理与espresso框架没有太大关系的
MonitoringInstrumentation
default activity launch timeout.@ericn您找到解决方案了吗?