• 8
name

A PHP Error was encountered

Severity: Notice

Message: Undefined index: userid

Filename: views/question.php

Line Number: 191

Backtrace:

File: /home/prodcxja/public_html/questions/application/views/question.php
Line: 191
Function: _error_handler

File: /home/prodcxja/public_html/questions/application/controllers/Questions.php
Line: 433
Function: view

File: /home/prodcxja/public_html/questions/index.php
Line: 315
Function: require_once

When start my android app first start FirstActivity. When I click button on FirstActivity than start AddTraderActivity. If I press button "START REQUEST" in AddTraderActivity then I call:

setResult(RESULT_OK);
finish();

As result AddTraderActivity is destroy and show FirstActivity. Nice.

Now I want to write Espresso's tests for AddTraderActivityTest . Here tests:

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

As result when I start this tests, then start ONLY AddTraderActivity and tests success pass. Nice.

Now I want to write test for click on button "START REQUEST"

Here test:

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

As result when test run and press button "START REQUEST" I get the next error:

Testing started at 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)

I get this error because in stack has no activity FirstActivity, because my test not start it. So the question is. How I can ISOLATE test only AddTraderActivity?

Ideally, you should probably use a separate class for testing separate activity.

But, if you need, you can isolate rules per method using following approach

[EDIT] (Caution: You can NOT use @get:Rule annotation anymore):

@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"))
}
  • 1
Reply Report
    • Now I get error: java.lang.IllegalStateException: #init was called twice in a row. Make sure to call #release after every #init
      • 2
    • Yeah, Man I'm sorry I should have been specific, You can NOT use @get:Rule annotation anymore. It is getting called for your second method as well. Updating answer.
      • 2
    • I try this : Rule JvmField var jsonViewActivity = ActivityTestRule(JsonViewActivity::class.java) Intents.init() intended(hasComponent(JsonViewActivity::class.java.getName())), but I get error: androidx.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: Wanted to match 1 intents. Actually matched 0 intents.