Я пытаюсь протестировать класс основной активности @AndroidEntryPoint с помощью Hilt Testing в своем приложении для Android. Класс PermissionHelper определяется следующим образом:
public class PermissionHelper {
private final AppCompatActivity mActivity;
@Inject
public PermissionHelper(AppCompatActivity activity) {
this.mActivity = activity;
}
}
Настройка Hilt-тестирования:
При использовании модульных тестов Android Studio не требует принудительного использования Hilt-тестирования. Однако для инструментальных тестов обязательно использовать Hilt-тестирование. Я создал тестовый модуль, который заменяет компонент «Активность». Я предоставляю помощник по активности и разрешениям следующим образом:
@Module
@TestInstallIn(components = [ActivityComponent::class], replaces = [ActivityModule::class])
class TestModule {
@Provides
@ActivityScoped
fun provideActivityScenario(): ActivityScenario {
// Launch MainActivity
return ActivityScenario.launch(MainActivity::class.java)
}
@Provides
@ActivityScoped
fun provideAppCompatActivity(scenario: ActivityScenario): Activity? {
// Extract AppCompatActivity from ActivityScenario
val activity = arrayOfNulls(1)
scenario.onActivity { a -> activity[0] = a }
return activity[0]
}
@ActivityScoped
@Provides
fun providePermissionHelperFake(activity: Activity): PermissionHelperFake {
return PermissionHelperFake(activity)
}
}
Обнаружена ошибка:
при использовании тестовых модулей и замене модуля активности Я получил ошибку, что активность имеет значение NULL и не может быть предоставлен, откуда я могу получить объект активности?
@UninstallModules(ActivityModule.class) // Uninstall the real PermissionModule
@HiltAndroidTest
@RunWith(AndroidJUnit4.class)
public class MainActivityTest {
@Rule public HiltAndroidRule hiltRule = new HiltAndroidRule(this);
@Inject PermissionHelperFake permissionHelper;
@Inject LayoutInflater layoutInflater;
@Inject FragmentManager fragmentManager;
@Before
public void setup() throws Exception {
hiltRule.inject();
}
@Test
public void testDependencies() {
assertNotNull(permissionHelper);
assertNotNull(layoutInflater);
assertNotNull(fragmentManager);
// Your test code here
}
Мои выводы заключаются в том, что Hilt не может обеспечивать активность или создавать активность, даже если я предоставляю активность из сценария, он может просто предоставлять контекст и его можно просто использовать в бэкэнд-тестирование.
Но при использовании инструментальных тестов студия Android заставляет меня использовать Hilt при запуске основного действия, поскольку это @AndroidEntryPoint, мой тест варианта использования также должен быть @HiltAndroidTest,
Почему тогда Android заставляет меня использовать hilt, если он не может обеспечить активность?
Есть идеи или рекомендации, как я могу начать тестирование пользовательского интерфейса с классами @AndroidEntryPoint ?
error: [Dagger/Nullable] android.app.Activity is not nullable, but is being provided by @Provides @dagger.hilt.android.scopes.ActivityScoped @org.jetbrains.annotations.Nullable android.app.Activity common.dependencyinjection.activity.TestModule.provideAppCompatActivity(androidx.test.core.app.ActivityScenario)
error: [Dagger/DuplicateBindings] android.app.Activity is bound multiple times:
public abstract static class SingletonC implements FragmentGetContextFix.FragmentGetContextFixEntryPoint,
rror: [Dagger/MissingBinding] android.app.Activity cannot be provided without an @Inject constructor or an @Provides-annotated method.
public abstract static class SingletonC implements FragmentGetContextFix.FragmentGetContextFixEntryPoint,
Подробнее здесь: https://stackoverflow.com/questions/787 ... nt-annotat