DEV Community

Cover image for Inyección de Dependencias en Android (skel) 💉
disced
disced

Posted on

Inyección de Dependencias en Android (skel) 💉

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

Documentación Oficial

project/build.gradle

plugins {  
    ...
    id 'com.google.dagger.hilt.android' version '2.44' apply false  
}
Enter fullscreen mode Exit fullscreen mode

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  
}
Enter fullscreen mode Exit fullscreen mode

Clase Application

Documentación Oficial

Obligatoria

@HiltAndroidApp  
class BaseApp: Application() { }
Enter fullscreen mode Exit fullscreen mode

Propiedad nombre (AndroidManifest.xml)

<?xml version="1.0" encoding="utf-8"?>  
<manifest ... >
    <application
        android:name=".BaseApp" />

</manifest>
Enter fullscreen mode Exit fullscreen mode

Proporcionar las dependencias

Documentación Oficial

@HiltViewModel
class MyCustomViewModel: ViewModel() { ... }
Enter fullscreen mode Exit fullscreen mode
@AndroidEntryPoint
class MyActivity: ComponentActivity() { ... }
Enter fullscreen mode Exit fullscreen mode

Android Entry point


Inyección en constructor

(mejor)

Documentación Oficial

@HiltViewModel
class MyCustomViewModel @Inject
constructor(private var myRepo: MyRepository) : ViewModel()
Enter fullscreen mode Exit fullscreen mode

Inyección en atributos

(peor)

@HiltViewModel
class MyCustomViewModel: ViewModel() {

    @Inject
    lateinit var myRepo: MyRepository

}
Enter fullscreen mode Exit fullscreen mode

Módulos

Documentación Oficial

@Module  
@InstallIn(SingletonComponent::class)  

class AppModule {  
    // Funciones para proveer clases
}
Enter fullscreen mode Exit fullscreen mode

Opciones @InstallIn

Hilt components with injector

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  
}
Enter fullscreen mode Exit fullscreen mode

Testing de la Inyección de Dependencias

(androidTests/)

  1. Importar dependencias
  2. Cambiar el testInstrumentationRunner en app/build.gradle
  3. Crear un CustomRunner de testing utilizando la clase HiltTestApplication
  4. 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'
}
Enter fullscreen mode Exit fullscreen mode

testInstrumentationRunner

app/build.gradle

android {

    testInstrumentationRunner "com.package.name.CustomRunner"
}
Enter fullscreen mode Exit fullscreen mode

CustomRunner

class CustomRunner : AndroidJUnitRunner() {  
    override fun newApplication(  
        cl: ClassLoader?,  
        className: String?,  
        context: Context?  
    ): Application {  
        return super.newApplication(cl, HiltTestApplication::class.java.name, context)  
    }  
}

Enter fullscreen mode Exit fullscreen mode

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")  
    }  
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)