当启动我的Android应用程序时,首先启动FirstActivity
。当我点击FirstActivity
上的按钮而不是启动AddTraderActivity
。如果我在AddTraderActivity
按下“START REQUEST”按钮,那么我打电话给:
setResult(RESULT_OK);
finish();
结果AddTraderActivity
摧毁并显示FirstActivity
。尼斯。
现在我想为AddTraderActivityTest
写Espresso的测试。这里测试:
@RunWith(AndroidJUnit4::class)
@SmallTest
class AddTraderActivityTest {
@get:Rule
var addTraderActivity: IntentsTestRule<AddTraderActivity> = IntentsTestRule(AddTraderActivity::class.java)
@Test
fun toolBarHeight() {
onView(withId(R.id.toolBar)).check(matches(withHeightResId(R.dimen.tool_bar_height)))
}
@Test
fun buttonStartTextUppercase() {
onView(withId(R.id.startButton)).check(matches(withTextUppercaseResId(R.string.start)))
}
结果当我开始这个测试,然后开始只有AddTraderActivity
并测试成功通过。尼斯。
现在我想编写测试点击按钮“START REQUEST”
这里测试:
@Test
fun pressButtonStartProgressBarDisplayed() {
onView(withId(R.id.baseTextInputEditText)).perform(typeText("BASE_TEST"))
onView(withId(R.id.quoteTextInputEditText)).perform(typeText("QUOTE_TEST"))
onView(withId(R.id.startButton)).perform(click())
onView(withId(R.id.containerProgressBarLayout)).check(matches(isDisplayed()))
}
结果当测试运行并按下“START REQUEST”按钮时,我得到下一个错误:
测试于16:05开始......
$ adb shell am instrument -w -r -e debug false -e class 'com.myproject.AddTraderActivityTest#pressButtonStartProgressBarDisplayed' com.myproject.debug.test/androidx.test.runner.AndroidJUnitRunner
Client not ready yet..
Started running tests
java.lang.RuntimeException: No activities found. Did you forget to launch the activity by calling getActivity() or startActivitySync or similar?
at androidx.test.espresso.base.RootViewPicker.waitForAtLeastOneActivityToBeResumed(RootViewPicker.java:169)
at androidx.test.espresso.base.RootViewPicker.get(RootViewPicker.java:83)
at androidx.test.espresso.ViewInteractionModule.provideRootView(ViewInteractionModule.java:77)
at androidx.test.espresso.ViewInteractionModule_ProvideRootViewFactory.provideRootView(ViewInteractionModule_ProvideRootViewFactory.java:35)
at androidx.test.espresso.ViewInteractionModule_ProvideRootViewFactory.get(ViewInteractionModule_ProvideRootViewFactory.java:24)
at androidx.test.espresso.ViewInteractionModule_ProvideRootViewFactory.get(ViewInteractionModule_ProvideRootViewFactory.java:10)
at androidx.test.espresso.base.ViewFinderImpl.getView(ViewFinderImpl.java:62)
at androidx.test.espresso.ViewInteraction$2.call(ViewInteraction.java:276)
at androidx.test.espresso.ViewInteraction$2.call(ViewInteraction.java:268)
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:5417)
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)
我得到这个错误,因为在堆栈中没有活动FirstActivity
,因为我的测试没有启动它。所以问题是。我怎么能只测试AddTraderActivity
?
理想情况下,您应该使用单独的类来测试单独的活动。
但是,如果需要,可以使用以下方法隔离每种方法的规则
[编辑](注意:你不能再使用@get:Rule
注释):
@Test
public void myTest() {
// launch desired activity
var firstActivity: IntentsTestRule<FirstActivity> = IntentsTestRule(FirstActivity::class.java)
firstActivity.launchActivity(Intent())
// add tests
onView(withId(R.id.baseTextInputEditText)).perform(typeText("BASE_TEST"))
onView(withId(R.id.quoteTextInputEditText)).perform(typeText("QUOTE_TEST"))
}