Hilt Espresso: действия не найдены. Вы забыли запустить действие, вызвав getActivity() или startActivitySync или что-то подобное?

#java #android #testing #android-espresso #dagger-hilt

#java #Android #тестирование #android-espresso #dagger-hilt

Вопрос:

При использовании Hilt с Espresso я обнаружил, что моя активность либо не возобновлена, либо не уничтожена. Когда я закомментировал самый первый тест, который запускает мою активность, второй начал проходить. Обходной путь заключается в разделении каждого теста, однако это приведет к появлению большого количества кода котельной плиты.

Также у меня есть пользовательское действие внутри тестов, которое наследуется от моего основного действия.

 @RunWith(AndroidJUnit4.class)
@HiltAndroidTest
public class MainActivityTest {
    // ... initilisation amp; mocks


    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        hiltAndroidRule.inject();
        context = getInstrumentation().getTargetContext();
        
        // ... other initialisation and setup
    }

    // Helper classes and functions
    @AndroidEntryPoint
    public class ModifiedMainActivity extends MainActivity {
        // ... custom activity implementations
    }

    // Factory
    private SingleActivityFactory<MainActivity> activityFactory = new SingleActivityFactory<MainActivity>(MainActivity.class) {
        @Override
        protected MainActivity create(Intent intent) {
            ModifiedMainActivity mainActivity = new ModifiedMainActivity();
            // other custom activity configuration amp; setup
            return mainActivity;
        }
    }

    @After
    public void tearDown() {
        // ... other code to tear down some stubs
    }
}
  

Есть идеи?

Я могу предоставить некоторый код, но другой находится под NDA.

Мои правила:

 @Rule(order = 0)
public HiltAndroidRule hiltAndroidRule = new HiltAndroidRule(this);
@Rule(order = 1)
public ActivityTestRule<MainActivity> mainActivityRule = new ActivityTestRule<>(activityFactory, true, false);
  

Тестовый пример:

 @Test
public void test_report_system_back_button_pressed_when_closing_main_activity() {
    Intent intent = new Intent(Intent.ACTION_MAIN);
    final MainActivity mainActivity = mainActivityRule.launchActivity(intent);
    getInstrumentation().runOnMainSync(mainActivity::onBackPressed);
    verify(mockedHelper, times(1)).reportEvent(eq(Codes.SYSTEM_BACK_PRESSED), eq("SystemBackPressed"), nullable(Map.class));
}
  

Исключение:

 
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:176)
at androidx.test.espresso.base.RootViewPicker.get(RootViewPicker.java:88)
at androidx.test.espresso.ViewInteractionModule.provideRootView(ViewInteractionModule.java:77)
at androidx.test.espresso.ViewInteractionModule_ProvideRootViewFactory.provideRootView(ViewInteractionModule_ProvideRootViewFactory.java:37)
at androidx.test.espresso.ViewInteractionModule_ProvideRootViewFactory.get(ViewInteractionModule_ProvideRootViewFactory.java:27)
at androidx.test.espresso.ViewInteractionModule_ProvideRootViewFactory.get(ViewInteractionModule_ProvideRootViewFactory.java:10)
at androidx.test.espresso.base.ViewFinderImpl.getView(ViewFinderImpl.java:63)
at androidx.test.espresso.ViewInteraction$2.call(ViewInteraction.java:280)
at androidx.test.espresso.ViewInteraction$2.call(ViewInteraction.java:272)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
  

Комментарии:

1. Могу я спросить, что именно вы хотите протестировать? Я думаю, что это тест пользовательского интерфейса?

2. @Andrew да, все тесты внутри этого класса являются тестами пользовательского интерфейса. Перед добавлением hilt они проходили без проблем.

3. Я предлагаю посмотреть этот урок: youtube.com/watch?v=k4zG93ogWFY , он показывает, как проверять фрагменты рукоятью кинжала.