2016-06-16 21 views
20

Tôi đang học thử nghiệm thiết bị thử nghiệm android với cà phê espresso. Tôi có một ứng dụng có một drawermenu và có menu gọi là About. Tôi đã thử nghiệm nhấp vào mục trình đơn đó và nội dung hoạt động.Thử nghiệm ý định pha cà phê không thực hiện

testfunction:

@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()); 
} 

nay là TextView qua đã weblink embeded trong đó. vì vậy khi bạn nhấp vào nó, nó sẽ mở ra liên kết (www.support.com) trong một webview trong ứng dụng nó tự. Tôi muốn thử nghiệm tính hấp dẫn này. vì vậy tôi cố gắng này:

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

nhưng thử nghiệm thất bại với lỗi dấu vết này:

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) 

Tôi cũng đã cố gắng quyết tâm bằng cách chạy không tải các nguồn lực trước khi kiểm tra cho ý định. Nhưng không hiệu quả. Ai có thể giúp được không?

Trả lời

53

Tôi đã gặp sự cố tương tự và đã giải quyết vấn đề này bằng cách sử dụng IntentsTestRule thay vì ActivityTestRule. IntentsTestRule là một phân lớp của ActivityTestRule. Thiết lập @Rule của bạn mà tạo ra các hoạt động như vậy:

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

Sử dụng IntentsTestRule thay vì ActivityTestRule khi sử dụng Espresso-Intents. https://google.github.io/android-testing-support-library/docs/espresso/intents/index.html

+0

ya. Hoàn hảo. Cảm ơn. –

3

Nếu bạn đang sử dụng một tùy chỉnh ActivityTestRule, bạn có thể thêm Intents.init(), Intents.release() cuộc gọi thích hợp:

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

@Override 
protected void afterActivityFinished() { 
    super.afterActivityFinished(); 
    Intents.release(); 
} 
+0

Điều này có thích hợp hơn khi sử dụng ** IntentsTestRule ** không? –

+1

Nó thực sự giống nhau. Nếu bạn đã có một ActivityTestRule tùy chỉnh hoặc bạn muốn kích hoạt tính năng này theo nghĩa thực tế thì sử dụng phương pháp này là hợp lý, nếu không thì chỉ cần sử dụng IntentsTestRule. – bonnyz

0

tôi đã cùng một vấn đề, tuy nhiên, việc chuyển đổi sang IntentsTestRule đã không làm việc, quá. Vì vậy, tôi quay lại ActivityTestRule và gọi Intents.init() trước và Intents.release() sau khi thử nghiệm đã gửi Mục đích.

Để biết thêm thông tin, vui lòng xem điều này reference.

Các vấn đề liên quan