私は学習しています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)
また、意図をチェックする前にリソースをアイドリングして解決を試みました。しかし、うまくいきませんでした。誰でも助けることができますか?
同じ問題があり、IntentsTestRule
の代わりにActivityTestRule
を使用して解決しました。 IntentsTestRule
はActivityTestRule
のサブクラスです。 @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
カスタムActivityTestRule
を使用している場合、適切なIntents.init(), Intents.release()
呼び出しを追加できます。
@Override
protected void afterActivityLaunched() {
Intents.init();
super.afterActivityLaunched();
}
@Override
protected void afterActivityFinished() {
super.afterActivityFinished();
Intents.release();
}
私も同じ問題を抱えていましたが、IntentsTestRule
への切り替えも機能しませんでした。そこで、ActivityTestRule
に戻り、Intentを送信したテストの前にIntents.init()
とIntents.release()
を呼び出しました。
詳細については、こちらを参照してください 参照 。