Почему Android заставляет меня использовать Hilt, если я хочу протестировать аннотированные классы @AndroidEntryPoint (UAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Почему Android заставляет меня использовать Hilt, если я хочу протестировать аннотированные классы @AndroidEntryPoint (U

Сообщение Anonymous »

Я пытаюсь протестировать класс основной активности @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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»