Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有浓缩咖啡和Proguard的Java.lang.NoClassDefFoundError_Java_Android_Junit_Android Testing_Android Espresso - Fatal编程技术网

带有浓缩咖啡和Proguard的Java.lang.NoClassDefFoundError

带有浓缩咖啡和Proguard的Java.lang.NoClassDefFoundError,java,android,junit,android-testing,android-espresso,Java,Android,Junit,Android Testing,Android Espresso,我对浓缩咖啡不是很有经验,但我最终成功地经营了它 我有一个应用程序,需要由Proguard收缩,以便在56K的方法 应用程序以3秒的动画开始,所以我需要等到动画结束后才能继续。这就是我尝试使用方法waitFor(长延迟) 我试图将此方法作为一个独立类、内部类甚至项目类来使用=相同的错误 这是Proguard文件: android { ... compileSdkVersion ANDROID_BUILD_SDK_VERSION buildToolsVersion ANDR

我对浓缩咖啡不是很有经验,但我最终成功地经营了它

我有一个应用程序,需要由Proguard收缩,以便在56K的方法

应用程序以3秒的动画开始,所以我需要等到动画结束后才能继续。这就是我尝试使用方法
waitFor(长延迟)

我试图将此方法作为一个独立类、内部类甚至项目类来使用=相同的错误

这是Proguard文件:

android {
    ...
    compileSdkVersion ANDROID_BUILD_SDK_VERSION
    buildToolsVersion ANDROID_BUILD_TOOLS_VERSION

    productFlavors {
        // Define separate dev and prod product flavors.
        dev {
            // dev utilizes minSDKVersion = 21 to allow the Android gradle plugin
            // to pre-dex each module and produce an APK that can be tested on
            // Android Lollipop without time consuming dex merging processes.
            minSdkVersion 21
        }
        prod {
            // The actual minSdkVersion for the application.
            minSdkVersion ANDROID_BUILD_MIN_SDK_VERSION
        }
    }
    defaultConfig {
        applicationId "fr.xs.app.y"
        targetSdkVersion ANDROID_BUILD_TARGET_SDK_VERSION
        minSdkVersion ANDROID_BUILD_MIN_SDK_VERSION
        versionCode ANDROID_BUILD_VERSION_CODE
        versionName ANDROID_BUILD_APP_VERSION_NAME
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    // point sur le build de test
    testBuildType = "validation"

    buildTypes {
        release {
            debuggable false
            ext.enableCrashlytics = true
            renderscriptOptimLevel 3
            signingConfig android.signingConfigs.release
            zipAlignEnabled true
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules-release.pro'
        }
        debug {
            debuggable true
            renderscriptOptimLevel 3
            applicationIdSuffix ".debug"
            versionNameSuffix "debug"
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules-debug.pro', 'proguard-rules-dontobfuscate.pro'
        }

        validation.initWith(debug)

        validation {
            debuggable false
            renderscriptOptimLevel 3
            applicationIdSuffix ".validation"
            versionNameSuffix "validation"
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules-debug.pro', 'proguard-rules-dontobfuscate.pro'
            testProguardFile('proguard-rules-test.pro')
        }
    }
...
}
import android.app.Activity;
import android.support.test.espresso.Espresso;
import android.support.test.espresso.IdlingPolicies;
import android.support.test.espresso.IdlingResource;
import android.support.test.espresso.core.deps.guava.collect.Iterables;
import android.support.test.espresso.matcher.ViewMatchers;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.support.test.runner.lifecycle.ActivityLifecycleMonitorRegistry;
import android.support.test.runner.lifecycle.Stage;
import android.test.suitebuilder.annotation.LargeTest;

import com.squareup.spoon.Spoon;

import org.apache.commons.lang3.StringUtils;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

import java.util.concurrent.TimeUnit;

import fr.xs.app.y.Activity.SplashScreenActivity;

import static android.support.test.InstrumentationRegistry.getInstrumentation;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.action.ViewActions.click;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.withEffectiveVisibility;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
import static org.hamcrest.CoreMatchers.allOf;

@RunWith(AndroidJUnit4.class)
@LargeTest
public class HelloWorldEspressoTest {

    @Rule
    public ActivityTestRule<SplashScreenActivity> mActivityRule = new ActivityTestRule<>(SplashScreenActivity.class);

    @Test
    public void seeHomeScreen() throws Throwable {

        // SpashScreen
        takeScreenShot("Chargement Application");
        onView(allOf(withText("Réveille l'amateur qui est en toi"),
                withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)))
                .check(matches(isCompletelyDisplayed()));
        takeScreenShot("Splash Screen en cours");
        waitForDelay(3000);
        takeScreenShot("Splash Screen à la fin");

        // HomeScree
        onView(allOf(withText("Nouvelle Dégustation"),
                withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)))
                .check(matches(isCompletelyDisplayed()));
        takeScreenShot("Home Screen");

        // Preference
        onView(withId(R.id.iv_seeParameters)).perform(click());
        onView(withId(R.id.content_frame_sign_unsign)).check(matches(isDisplayed()));
        takeScreenShot("Preferences Screen");


    Activity getCurrentActivity() throws Throwable {
        getInstrumentation().waitForIdleSync();
        final Activity[] activity = new Activity[1];

        getInstrumentation().runOnMainSync(new Runnable() {
            @Override
            public void run() {

                java.util.Collection activites = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED);
                activity[0] = (Activity) Iterables.getOnlyElement(activites);
            }
        });
        return activity[0];
    }

    private static void waitForDelay(long waitingTime) {

        // 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);


        // Clean up
        Espresso.unregisterIdlingResources(idlingResource);
    }

    private void takeScreenShot(String title) throws Throwable {
        String string = StringUtils.stripAccents(title).replace(" ", "_");
        Spoon.screenshot(getCurrentActivity(), string);
    }

    static 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;
        }
    }
}
Proguard配置

以下是Proguard文件(调试和测试) -保持类fr.xs.app.y.*{*;} -顿托夫斯卡特

我检查了这个类是否在mapping.txt(build/output/mapping/androidTest/dev)中,并且没有转换成另一个字符串

这是测试类:

android {
    ...
    compileSdkVersion ANDROID_BUILD_SDK_VERSION
    buildToolsVersion ANDROID_BUILD_TOOLS_VERSION

    productFlavors {
        // Define separate dev and prod product flavors.
        dev {
            // dev utilizes minSDKVersion = 21 to allow the Android gradle plugin
            // to pre-dex each module and produce an APK that can be tested on
            // Android Lollipop without time consuming dex merging processes.
            minSdkVersion 21
        }
        prod {
            // The actual minSdkVersion for the application.
            minSdkVersion ANDROID_BUILD_MIN_SDK_VERSION
        }
    }
    defaultConfig {
        applicationId "fr.xs.app.y"
        targetSdkVersion ANDROID_BUILD_TARGET_SDK_VERSION
        minSdkVersion ANDROID_BUILD_MIN_SDK_VERSION
        versionCode ANDROID_BUILD_VERSION_CODE
        versionName ANDROID_BUILD_APP_VERSION_NAME
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    // point sur le build de test
    testBuildType = "validation"

    buildTypes {
        release {
            debuggable false
            ext.enableCrashlytics = true
            renderscriptOptimLevel 3
            signingConfig android.signingConfigs.release
            zipAlignEnabled true
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules-release.pro'
        }
        debug {
            debuggable true
            renderscriptOptimLevel 3
            applicationIdSuffix ".debug"
            versionNameSuffix "debug"
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules-debug.pro', 'proguard-rules-dontobfuscate.pro'
        }

        validation.initWith(debug)

        validation {
            debuggable false
            renderscriptOptimLevel 3
            applicationIdSuffix ".validation"
            versionNameSuffix "validation"
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules-debug.pro', 'proguard-rules-dontobfuscate.pro'
            testProguardFile('proguard-rules-test.pro')
        }
    }
...
}
import android.app.Activity;
import android.support.test.espresso.Espresso;
import android.support.test.espresso.IdlingPolicies;
import android.support.test.espresso.IdlingResource;
import android.support.test.espresso.core.deps.guava.collect.Iterables;
import android.support.test.espresso.matcher.ViewMatchers;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.support.test.runner.lifecycle.ActivityLifecycleMonitorRegistry;
import android.support.test.runner.lifecycle.Stage;
import android.test.suitebuilder.annotation.LargeTest;

import com.squareup.spoon.Spoon;

import org.apache.commons.lang3.StringUtils;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

import java.util.concurrent.TimeUnit;

import fr.xs.app.y.Activity.SplashScreenActivity;

import static android.support.test.InstrumentationRegistry.getInstrumentation;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.action.ViewActions.click;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.withEffectiveVisibility;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
import static org.hamcrest.CoreMatchers.allOf;

@RunWith(AndroidJUnit4.class)
@LargeTest
public class HelloWorldEspressoTest {

    @Rule
    public ActivityTestRule<SplashScreenActivity> mActivityRule = new ActivityTestRule<>(SplashScreenActivity.class);

    @Test
    public void seeHomeScreen() throws Throwable {

        // SpashScreen
        takeScreenShot("Chargement Application");
        onView(allOf(withText("Réveille l'amateur qui est en toi"),
                withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)))
                .check(matches(isCompletelyDisplayed()));
        takeScreenShot("Splash Screen en cours");
        waitForDelay(3000);
        takeScreenShot("Splash Screen à la fin");

        // HomeScree
        onView(allOf(withText("Nouvelle Dégustation"),
                withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)))
                .check(matches(isCompletelyDisplayed()));
        takeScreenShot("Home Screen");

        // Preference
        onView(withId(R.id.iv_seeParameters)).perform(click());
        onView(withId(R.id.content_frame_sign_unsign)).check(matches(isDisplayed()));
        takeScreenShot("Preferences Screen");


    Activity getCurrentActivity() throws Throwable {
        getInstrumentation().waitForIdleSync();
        final Activity[] activity = new Activity[1];

        getInstrumentation().runOnMainSync(new Runnable() {
            @Override
            public void run() {

                java.util.Collection activites = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED);
                activity[0] = (Activity) Iterables.getOnlyElement(activites);
            }
        });
        return activity[0];
    }

    private static void waitForDelay(long waitingTime) {

        // 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);


        // Clean up
        Espresso.unregisterIdlingResources(idlingResource);
    }

    private void takeScreenShot(String title) throws Throwable {
        String string = StringUtils.stripAccents(title).replace(" ", "_");
        Spoon.screenshot(getCurrentActivity(), string);
    }

    static 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;
        }
    }
}
导入android.app.Activity;
导入android.support.test.espresso.espresso;
导入android.support.test.espresso.IdlingPolicies;
导入android.support.test.espresso.IdlingResource;
导入android.support.test.espresso.core.deps.guava.collect.Iterables;
导入android.support.test.espresso.matcher.ViewMatchers;
导入android.support.test.rule.ActivityTestRule;
导入android.support.test.runner.AndroidJUnit4;
导入android.support.test.runner.lifecycle.ActivityLifecycleMonitorRegistry;
导入android.support.test.runner.lifecycle.Stage;
导入android.test.suitebuilder.annotation.LargeTest;
导入com.squareup.spoon.spoon;
导入org.apache.commons.lang3.StringUtils;
导入org.junit.Rule;
导入org.junit.Test;
导入org.junit.runner.RunWith;
导入java.util.concurrent.TimeUnit;
导入fr.xs.app.y.Activity.SplashScreenActivity;
导入静态android.support.test.InstrumentationRegistry.getInstrumentation;
导入静态android.support.test.espresso.espresso.onView;
导入静态android.support.test.espresso.action.ViewActions.click;
导入静态android.support.test.espresso.assertion.ViewAssertions.matches;
导入静态android.support.test.espresso.matcher.ViewMatchers.Is完全显示;
导入静态android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
导入静态android.support.test.espresso.matcher.ViewMatchers.withEffectiveVisibility;
导入静态android.support.test.espresso.matcher.ViewMatchers.withId;
导入静态android.support.test.espresso.matcher.ViewMatchers.withText;
导入静态org.hamcrest.CoreMatchers.allOf;
@RunWith(AndroidJUnit4.class)
@最大的
公共级HelloWorld浓缩咖啡酒店{
@统治
public ActivityTestRule mActivityRule=新的ActivityTestRule(SplashScreenActivity.class);
@试验
公共空间请参见主屏幕()可丢弃{
//垃圾筛
截图(“收费申请”);
onView(所有文字(“Réveille l'业余风格”),
withEffectiveVisibility(ViewMatchers.Visibility.Visibility)))
.检查(匹配项(已完全显示());
截图(当然是闪屏);
韦特福德(3000);
截图(“闪屏拉芬”);
//家信
onView(allOf(带文本(“新味觉”),
withEffectiveVisibility(ViewMatchers.Visibility.Visibility)))
.检查(匹配项(已完全显示());
截图(“主屏幕”);
//偏好
onView(使用id(R.id.iv_seeParameters))。执行(单击());
onView(带id(R.id.content\u frame\u sign\u unsign)).check(匹配项(isDisplayed());
截图(“首选项屏幕”);
Activity getCurrentActivity()抛出可丢弃的{
getInstrumentation().waitForIdleSync();
最终活动[]活动=新活动[1];
getInstrumentation().runOnMainSync(新的Runnable()命令){
@凌驾
公开募捐{
java.util.Collection activites=ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.resume);
活动[0]=(活动)Iterables.getOnlyElement(活动);
}
});
返回活动[0];
}
私有静态void waitForDelay(长等待时间){
//确保浓缩咖啡不会超时
IDlingPolicys.setMasterPolicyTimeout(waitingTime*2,时间单位为毫秒);
IDlingPolicys.setIdlingResourceTimeout(waitingTime*2,时间单位为毫秒);
//现在我们等待
IdlingResource IdlingResource=新的ElapsedTimeIdlingResource(waitingTime);
意式浓缩咖啡注册资源(idlingResource);
//清理
浓缩咖啡。未注册的IdlingResources(idlingResource);
}
私有void截图(字符串标题)抛出可丢弃{
String String=StringUtils.stripeAccents(标题)。替换(“,”);
屏幕截图(getCurrentActivity(),字符串);
}
静态类ElapsedTimeIdlingResource实现IdlingResource{
私人最终长启动时间;
私人最终长时间等待;
私有资源回调;
公共ElapsedTimeIdlingResource(长等待时间){
this.startTime=System.currentTimeMillis();
this.waitingTime=waitingTime;
}
@凌驾
公共字符串getName(){
返回ElapsedTimeIdlingResource.class.getName()+“:”+waitingTime;
}
@凌驾
公共布尔值isIdleNow(){
长时间运行=System.currentTimeMillis()-startTime;
布尔空闲=(已用>=等待时间);
如果(空闲){
resourceCallback.onTransitionToIdle();
}
返回空闲状态;
}
@凌驾
公共无效RegisterIDletionCallback(ResourceCallback ResourceCallback){
this.resourceCallback=resourceCallback;
}
}
}
这是日志:

android {
    ...
    compileSdkVersion ANDROID_BUILD_SDK_VERSION
    buildToolsVersion ANDROID_BUILD_TOOLS_VERSION

    productFlavors {
        // Define separate dev and prod product flavors.
        dev {
            // dev utilizes minSDKVersion = 21 to allow the Android gradle plugin
            // to pre-dex each module and produce an APK that can be tested on
            // Android Lollipop without time consuming dex merging processes.
            minSdkVersion 21
        }
        prod {
            // The actual minSdkVersion for the application.
            minSdkVersion ANDROID_BUILD_MIN_SDK_VERSION
        }
    }
    defaultConfig {
        applicationId "fr.xs.app.y"
        targetSdkVersion ANDROID_BUILD_TARGET_SDK_VERSION
        minSdkVersion ANDROID_BUILD_MIN_SDK_VERSION
        versionCode ANDROID_BUILD_VERSION_CODE
        versionName ANDROID_BUILD_APP_VERSION_NAME
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    // point sur le build de test
    testBuildType = "validation"

    buildTypes {
        release {
            debuggable false
            ext.enableCrashlytics = true
            renderscriptOptimLevel 3
            signingConfig android.signingConfigs.release
            zipAlignEnabled true
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules-release.pro'
        }
        debug {
            debuggable true
            renderscriptOptimLevel 3
            applicationIdSuffix ".debug"
            versionNameSuffix "debug"
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules-debug.pro', 'proguard-rules-dontobfuscate.pro'
        }

        validation.initWith(debug)

        validation {
            debuggable false
            renderscriptOptimLevel 3
            applicationIdSuffix ".validation"
            versionNameSuffix "validation"
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules-debug.pro', 'proguard-rules-dontobfuscate.pro'
            testProguardFile('proguard-rules-test.pro')
        }
    }
...
}
import android.app.Activity;
import android.support.test.espresso.Espresso;
import android.support.test.espresso.IdlingPolicies;
import android.support.test.espresso.IdlingResource;
import android.support.test.espresso.core.deps.guava.collect.Iterables;
import android.support.test.espresso.matcher.ViewMatchers;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.support.test.runner.lifecycle.ActivityLifecycleMonitorRegistry;
import android.support.test.runner.lifecycle.Stage;
import android.test.suitebuilder.annotation.LargeTest;

import com.squareup.spoon.Spoon;

import org.apache.commons.lang3.StringUtils;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

import java.util.concurrent.TimeUnit;

import fr.xs.app.y.Activity.SplashScreenActivity;

import static android.support.test.InstrumentationRegistry.getInstrumentation;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.action.ViewActions.click;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.withEffectiveVisibility;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
import static org.hamcrest.CoreMatchers.allOf;

@RunWith(AndroidJUnit4.class)
@LargeTest
public class HelloWorldEspressoTest {

    @Rule
    public ActivityTestRule<SplashScreenActivity> mActivityRule = new ActivityTestRule<>(SplashScreenActivity.class);

    @Test
    public void seeHomeScreen() throws Throwable {

        // SpashScreen
        takeScreenShot("Chargement Application");
        onView(allOf(withText("Réveille l'amateur qui est en toi"),
                withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)))
                .check(matches(isCompletelyDisplayed()));
        takeScreenShot("Splash Screen en cours");
        waitForDelay(3000);
        takeScreenShot("Splash Screen à la fin");

        // HomeScree
        onView(allOf(withText("Nouvelle Dégustation"),
                withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)))
                .check(matches(isCompletelyDisplayed()));
        takeScreenShot("Home Screen");

        // Preference
        onView(withId(R.id.iv_seeParameters)).perform(click());
        onView(withId(R.id.content_frame_sign_unsign)).check(matches(isDisplayed()));
        takeScreenShot("Preferences Screen");


    Activity getCurrentActivity() throws Throwable {
        getInstrumentation().waitForIdleSync();
        final Activity[] activity = new Activity[1];

        getInstrumentation().runOnMainSync(new Runnable() {
            @Override
            public void run() {

                java.util.Collection activites = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED);
                activity[0] = (Activity) Iterables.getOnlyElement(activites);
            }
        });
        return activity[0];
    }

    private static void waitForDelay(long waitingTime) {

        // 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);


        // Clean up
        Espresso.unregisterIdlingResources(idlingResource);
    }

    private void takeScreenShot(String title) throws Throwable {
        String string = StringUtils.stripAccents(title).replace(" ", "_");
        Spoon.screenshot(getCurrentActivity(), string);
    }

    static 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;
        }
    }
}
04-26 10:15:52.322?D/生命周期监视器:生命周期