web-dev-qa-db-ja.com

エスプレッソ意図テストの失敗

私は学習していますAndroidエスプレッソを使用した計測テスト。引き出しメニューがあるアプリがあり、Aboutというメニューがあります。そのメニュー項目とアクティビティのコンテンツをクリックしてテストしていました。

テスト機能:

  @Test
public void testNavigationDrawerAboutMenu() {
    onView(withId(R.id.drawer_layout))
            .perform(DrawerActions.open()); //open drawer
    onView(withText("About")).perform(click());
    onView(withId(R.id.aboutsptemail)).check(matches(withText(R.string.screen_about_support_email)));
    onView(withId(R.id.aboutcpright)).check(matches(isDisplayed()));
    onView(withId(R.id.aboutprivacy)).check(matches(isDisplayed()));
    onView(withId(R.id.abouttermsconditions)).check(matches(isDisplayed()));
    onView(withId(R.id.aboutsptemail)).perform(click());
}

これで、最後のテキストビューにウェブリンクが埋め込まれました。クリックすると、アプリ内のWebビューでリンク(www.support.com)が開きます。この機能をテストしたい。だから私はこれを試しました:

intended(hasComponent(WebViewActivity.class.getName())); //check if webview called on supportEmail link click

しかし、次のエラートレースでテストは失敗します。

Java.lang.NullPointerException: Attempt to invoke virtual method 'Android.support.test.espresso.intent.OngoingStubbing Android.support.test.espresso.intent.Intents.internalIntending(org.hamcrest.Matcher)' on a null object reference
at Android.support.test.espresso.intent.Intents.intending(Intents.Java:155)
at com.ScanBuy.SmartLabel.NavigationDrawerActivityTests.testNavigationDrawerAboutMenu(NavigationDrawerActivityTests.Java:94)
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 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.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)

また、意図をチェックする前にリソースをアイドリングして解決を試みました。しかし、うまくいきませんでした。誰でも助けることができますか?

27
HirenPatel_

同じ問題があり、IntentsTestRuleの代わりにActivityTestRuleを使用して解決しました。 IntentsTestRuleActivityTestRuleのサブクラスです。 @Ruleは次のようなアクティビティを作成します。

@Rule
public IntentsTestRule<MyActivity> mActivity = new IntentsTestRule<MyActivity>(MyActivity.class) {
    @Override
    protected Intent getActivityIntent() {
        ...
    }
};

詳細については、次のプロジェクトを参照してください。 https://github.com/googlesamples/Android-testing/tree/master/ui/espresso/IntentsBasicSample

73
splatte

カスタムActivityTestRuleを使用している場合、適切なIntents.init(), Intents.release()呼び出しを追加できます。

@Override
protected void afterActivityLaunched() {
    Intents.init();
    super.afterActivityLaunched();
}

@Override
protected void afterActivityFinished() {
    super.afterActivityFinished();
    Intents.release();
}
8
bonnyz

私も同じ問題を抱えていましたが、IntentsTestRuleへの切り替えも機能しませんでした。そこで、ActivityTestRuleに戻り、Intentを送信したテストの前にIntents.init()Intents.release()を呼び出しました。

詳細については、こちらを参照してください 参照

6
Petterson