Vous êtes vous déjà demandé quelle syntaxe était la bonne entre :

class MyDependance{}

//Solution 1 
class MyClass{
 private lateinit var dependance: MyDependance
}

//Solution 2
class MyClass(private val dependance: MyDependance){}

Au cours de mes années d’expériences en tant que développeur Android, je me suis souvent posé cette question.

Comme le montre le code ci-dessus, l’objectif est d’utiliser une classe MyDependance dans une autre classe. Pour cela on peut soit :

1. Créer une propriété dans la classe (solution 1)

2. Utiliser le constructeur de la classe (solution 2)

Mais quelle est la meilleur solution des deux…? 🤔

Pour répondre à cette question, il faut voir plus loin qu’écrire du simple code mais résonner en terme de Tests Unitaires

Les Tests Unitaires à la rescousse

Comme précisé dans l’article Tests Unitaires, l’objectif d’un développeur est de s’assuré que son code est testable de façon unitaire.

Pour cela il doit isoler la classe à tester en injectant toutes les dépendances externes à celle-ci. Cela permet ensuite de simuler le comportement d’objets réels de manière contrôlée.

Reprenons et commentons maintenant les deux solutions proposées au début de cet article :

class MyDependance{}

//Solution 1 
class MyClass {
 private lateinit var dependance = MyDependance()
}

Dans cette solution, la dépendance est créée en tant que propriété de la classe. Elle n’est donc pas injectée et ne pourra pas être testée de façon unitaire (en tout cas sans modifier la visibilité de la propriété).

class MyDependance{}

//Solution 2
class MyClass(private val dependance: MyDependance){}

Contrairement à la solution 1, la dépendance ici est passée à la classe en utilisant son constructeur. On dit qu’elle est injectée par le constructeur et l’écriture de tests unitaires est donc maintenant possible.

Cela signifie que votre rôle en tant que développeur peut maintenant être atteint : écrire du code testable de manière unitaire

Écrit par 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *