La principal idea de dicho post es tener un esqueleto básico de la Inyección de Dependencias en Android mediante Dagger Hilt.
Por lo tanto, obviaré explicaciones sobre dicho patrón y que problemas resuelve.
Adjunto un enlace de una publicación de freeCodeCamp
en la que se explica: Dependency Injection: what it is
- Dependencias Dagger Hilt
- Clase Application
- Proporcionar las dependencias
- Inyección en constructor
- Inyección en atributos
Dependencias Dagger Hilt
project/build.gradle
plugins {
...
id 'com.google.dagger.hilt.android' version '2.44' apply false
}
project/app/build.gradle
...
plugins {
id 'kotlin-kapt'
id 'com.google.dagger.hilt.android'
}
dependencies {
implementation "com.google.dagger:hilt-android:2.44"
kapt "com.google.dagger:hilt-compiler:2.44"
}
kapt {
correctErrorTypes true
}
Clase Application
Obligatoria
@HiltAndroidApp
class BaseApp: Application() { }
Propiedad nombre (
AndroidManifest.xml
)
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application
android:name=".BaseApp" />
</manifest>
Proporcionar las dependencias
@HiltViewModel
class MyCustomViewModel: ViewModel() { ... }
@AndroidEntryPoint
class MyActivity: ComponentActivity() { ... }
Inyección en constructor
(mejor)
@HiltViewModel
class MyCustomViewModel @Inject
constructor(private var myRepo: MyRepository) : ViewModel()
Inyección en atributos
(peor)
@HiltViewModel
class MyCustomViewModel: ViewModel() {
@Inject
lateinit var myRepo: MyRepository
}
Módulos
@Module
@InstallIn(SingletonComponent::class)
class AppModule {
// Funciones para proveer clases
}
Opciones @InstallIn
Proveer dependencias en módulos
@Singleton
@Provides
fun providesDatabase
(@ApplicationContext context: Context): UsersDb {
return Room
.databaseBuilder(
context,
UsersDb::class.java, "users_db")
.build()
}
@Provides
fun provideApplicationContext(@ApplicationContext context: Context): Context {
return context
}
Testing de la Inyección de Dependencias
(androidTests/)
- Importar dependencias
- Cambiar el
testInstrumentationRunner
enapp/build.gradle
- Crear un
CustomRunner
de testing utilizando la claseHiltTestApplication
- Anotar la clase de test con
@HiltAndroidTest
Dependencias Testing
app/build.gradle
dependencies {
testImplementation 'com.google.dagger:hilt-android-testing:2.44'
kaptTest 'com.google.dagger:hilt-android-compiler:2.44'
androidTestImplementation 'com.google.dagger:hilt-android-testing:2.44'
kaptAndroidTest 'com.google.dagger:hilt-android-compiler:2.44'
}
testInstrumentationRunner
app/build.gradle
android {
testInstrumentationRunner "com.package.name.CustomRunner"
}
CustomRunner
class CustomRunner : AndroidJUnitRunner() {
override fun newApplication(
cl: ClassLoader?,
className: String?,
context: Context?
): Application {
return super.newApplication(cl, HiltTestApplication::class.java.name, context)
}
}
Clase de Test
@HiltAndroidTest
@RunWith(AndroidJUnit4::class)
class DITests {
// Es la clase que inyecta dependencias en los tests
@get:Rule
var hiltRule = HiltAndroidRule(this)
// Inyección (pero no se inyecta)
@Inject
lateinit var context: Context
// Aqui es donde se inyecta
@Before
fun setUp() {
hiltRule.inject()
}
@Test
fun testContextInjection() {
val cacheDir = context.cacheDir.name
assertEquals(cacheDir, "cache")
}
}
Top comments (0)