2016-06-22 8 views
1

ich zwei Probleme haben, während meine Tests zu erstellen:-Test kann nicht Klick ausführen und nicht die Aufnahme Absichten

1 - Wenn das Auslösen des OnClick-Ereignis meiner Tätigkeit zu testen, versuchen, um eine neue Aktivität öffnet, sehe ich, dass die Aktivität in meinem Emulator/Gerät geöffnet. Der Test gibt jedoch die Ablaufverfolgung nicht, die den Onclick nicht ausführen kann.

Mein Code:

@OnClick(R.id.my_activity_next_activity_button) 
public void onNextActivityButtonClick(){ 
    Intent intent = new Intent(this, StreamingActivity.class); 
    startActivity(intent); 
} 

Test:

@RunWith(AndroidJUnit4.class) 
public class MyActivityTest{ 

    @Rule 
    public IntentsTestRule<MyActivity> rule = new IntentsTestRule<>(MyActivity.class); 

    @Test 
    public void testButtonOnClickShouldOpenNewActivity(){ 

     onView(withId(R.id.my_activity_next_activity_button)).perform(click()); 
     Intents.intended(IntentMatchers.hasComponent(NewActivity.class.getName())); 

    } 
} 

Ich habe auch versucht InstrumentationTestCase aber mit gleichen Ergebnisse zu verwenden:

@Test 
    public void testPickUpButtonShouldEmitPickUpIntentAndChangeStateToInitial(){ 

     Instrumentation.ActivityMonitor activityMonitor = new Instrumentation.ActivityMonitor(StreamingActivity.class.getName(), null, false); 
     getInstrumentation().addMonitor(activityMonitor); 

     onView(withId(R.id.activity_incoming_call_button_pick_up)).perform(click()); 

     Activity activity = activityMonitor.waitForActivityWithTimeout(5000); 

     assertNotNull(activity); 

    } 

Die Spuren erhalte ich:

android.support.test.espresso.PerformException: Error performing 'single click - At Coordinates: 788, 1688 and precision: 16, 16' on view 'with id: com.entelgy.telemadrid.haztutele:id/activity_incoming_call_button_pick_up'. 
at android.support.test.espresso.PerformException$Builder.build(PerformException.java:83) 
at android.support.test.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.java:80) 
at android.support.test.espresso.base.DefaultFailureHandler.handle(DefaultFailureHandler.java:56) 
at android.support.test.espresso.ViewInteraction.runSynchronouslyOnUiThread(ViewInteraction.java:184) 
at android.support.test.espresso.ViewInteraction.doPerform(ViewInteraction.java:115) 
at android.support.test.espresso.ViewInteraction.perform(ViewInteraction.java:87) 
at com.entelgy.telemadrid.haztutele.ActivitiesTests.IncomingCallActivityTest.testPickUpButtonShouldEmitPickUpIntentAndChangeStateToInitial(IncomingCallActivityTest.java:53) 
at java.lang.reflect.Method.invoke(Native Method) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
at android.support.test.internal.statement.UiThreadStatement.evaluate(UiThreadStatement.java:55) 
at android.support.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:270) 
at org.junit.rules.RunRules.evaluate(RunRules.java:20) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
at org.junit.runners.Suite.runChild(Suite.java:128) 
at org.junit.runners.Suite.runChild(Suite.java:27) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
at org.junit.runner.JUnitCore.run(JUnitCore.java:115) 
at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:59) 
at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:262) 
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1879) 
Caused by: android.support.test.espresso.AppNotIdleException: Looped for 3624 iterations over 60 SECONDS. The following Idle Conditions failed . 
at android.support.test.espresso.IdlingPolicy.handleTimeout(IdlingPolicy.java:61) 
at android.support.test.espresso.base.UiControllerImpl.loopUntil(UiControllerImpl.java:480) 
at android.support.test.espresso.base.UiControllerImpl.loopUntil(UiControllerImpl.java:411) 
at android.support.test.espresso.base.UiControllerImpl.injectMotionEvent(UiControllerImpl.java:229) 
at android.support.test.espresso.action.MotionEvents.sendUp(MotionEvents.java:138) 
at android.support.test.espresso.action.MotionEvents.sendUp(MotionEvents.java:118) 
at android.support.test.espresso.action.Tap.sendSingleTap(Tap.java:135) 
at android.support.test.espresso.action.Tap.access$100(Tap.java:35) 
at android.support.test.espresso.action.Tap$1.sendTap(Tap.java:40) 
at android.support.test.espresso.action.GeneralClickAction.perform(GeneralClickAction.java:98) 
at android.support.test.espresso.ViewInteraction$1.run(ViewInteraction.java:144) 
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423) 
at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5422) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

2 - Problem mit Test Absichten ich sende:

Beim Versuch, zu testen, ob ich eine Absicht bin das Senden (egal, ob es für das Starten eine Aktivität oder eine über LocalBroadcast Senden), kann ich nicht die Art und Weise feststellen, dass mein Prüfprotokolle es:

Aktivität:

@OnClick(R.id.my_activity_button_send_intent) 
public void onIntentButtonClick(){ 
    LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent(Constants.INTENT_DEFAULT)); 
} 

Test:

@Test 
    public void testOnButtonClickShouldSendIntent(){ 
     onView(withId(R.id.my_activity_button_send_intent)).perform(click()); 
     Intents.intended(IntentMatchers.hasComponent(Constants.INTENT_DEFAULT)); 
    } 

Und Spur:

android.support.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: Wanted to match 1 intents. Actually matched 0 intents. 

IntentMatcher: has component: has component with: class name: is "com.testproject.disframus:INTENT_DEFAULT" package name: an instance of java.lang.String short class name: an instance of java.lang.String 

Matched intents:[] 

Recorded intents:[] 

Können Sie mich auf das führen, was ich falsch mache?

Antwort

0

Das erste Problem tritt auf, weil etwas am UI-Thread arbeitet. Z.B. Die StreamingActivity funktioniert auf dem ui-Thread, wenn es gestartet wird (onCreate/onStart/onResume) oder die andere Activity (die die Intent startet) blockiert den ui Thread z. in /onStop.

Hat jede Aktivität

  1. Display eine unbestimmte ProgressBar in jeder jener Activities (beispielsweise in onCreate()//onStop)?
  2. Anzeige jeder Art von Animation oder DrawableAnimation?
  3. arbeit am ui thread?

Zum zweiten Problem. Zuerst ist die Übereinstimmung der Absicht falsch, hasComponent() wird verwendet, um die Intent für die richtige Komponente (z. B. eine Activity) zu überprüfen, die gestartet werden soll. Sie können den vollständigen qualifizierten Namen verwenden:

intended(hasComponent(StreamingActivity.class.getName()); 

Es ist nicht klar, weil man nicht den gesamten Code geschrieben, aber wenn der testOnButtonClickShouldSendIntent() Test der StreamingActivity von Problem man beginnt, dann ist die ui Blockierungsprobleme blockiere auch Aufnahme Absichten.