Android Studio 3.4
J'ai la méthode suivante que je teste. Fondamentalement, ce test fait une requête et renvoie un LoginResponseEntity
qui sera mappé et un Single<LoginResponse>
override fun loginUserPost(username: String, password: String, uniqueIdentifier: String, deviceToken: String, apiToken: String) : Single<LoginResponse> {
val loginRequestEntity = LoginRequestEntity(username, password, uniqueIdentifier, deviceToken)
return loginAPIService.loginUserPost(loginRequestEntity, apiToken)
.map {
loginResponseDomainMapper.map(it)
}
}
Le cas de test, j’ai écrit des travaux, mais je pense que ce n’est pas tout à fait le test de cette méthode.
@Test
fun `should return LoginResponse`() {
val loginRequestEntity = LoginRequestEntity("username", "password", "uniqueidentifier", "devicetoken")
val loginResponse = LoginResponse("token", createUser(), emptyList(), emptyList())
val loginResponseEntity = LoginResponseEntity("token", createUserEntity(), emptyList(), emptyList())
whenever(loginAPIService.loginUserPost(loginRequestEntity, "apitoken")).thenReturn(Single.just(loginResponseEntity))
loginServiceImp.loginUserPost("username", "password", "uniqueidentifier", "devicetoken", "apitoken")
.test()
.assertValue(loginResponse)
verify(loginAPIService).loginUserPost(loginRequestEntity, "apitoken")
}
private fun createUser() =
User(
"id",
"email",
"firstname",
"lastname",
"phone",
"address",
"dob",
"customer",
listOf("enterpriseids"),
listOf("vendorids"))
private fun createUserEntity() =
UserEntity(
"id",
"email",
"firstname",
"lastname",
"phone",
"address",
"dob",
"customer",
listOf("enterpriseids"),
listOf("vendorids"))
}
Y a-t-il autre chose que je puisse faire pour tester cette méthode? Devrais-je tester la partie .map{loginResponseDomainMapper.map(it)
de cette méthode?
Cette méthode est vraiment petite et ne contient pas beaucoup de choses à tester. Deux dépendances externes (loginAPIService
et loginResponseDomainMapper
) réduisent le nombre d'éléments à tester encore plus.
Alors,
1) loginResponseDomainMapper
ne fait pas partie de la méthode testée et doit également être moqué.
2) Vous devez comprendre ce qui devrait être testé ici.
LoginRequestEntity
a été correctement construit et passé à la méthode loginUserPost
. Cela se fait par appel verify(loginAPIService).loginUserPost(loginRequestEntity, "apitoken")
. De plus, vous pouvez utiliser ArgumentCaptor
.loginUserPost
a été correctement transmise à la méthode loginResponseDomainMapper.map
. Cela pourrait être fait avec un appel supplémentaire verify
comme précédemment.assertValue
call.Donc, vous essayez simplement de vérifier que le flux de données était correct et que rien n'a été modifié pendant l'exécution par les extraterrestres ou quelque chose comme ça.
3) test négatif. Il n'y a pas non plus beaucoup de choses qui peuvent aller mal. Si loginUserPost
ne possède pas d'annotation @NotNull
, il est préférable de gérer le résultat null
de cette fonction.
Et si la requête était incorrecte? Le mot de passe était incorrect ou apitoken
a expiré? Je crois que cela n’aura pas de conséquences tristes, mais vous devriez y remédier.
Vous pouvez ajouter des tests pour les scénarios qui échouent:
1) Si loginUserPost
échoue, vous pouvez ajouter:
whenever(loginAPIService.loginUserPost(any(), any())).thenReturn(Single.error(Exception()))
...
.test()
.assertError(...)
2) Si loginResponseDomainMapper
échoue, vous pouvez ajouter:
whenever(loginResponseDomainMapper.map(any())).thenThrow(Exception())
...
.test()
.assertError(...)
De cette façon, vous pouvez tester le mappage non réussi/réussi et la sortie de fonction sans entrer dans les détails. loginResponseDomainMapper
comportement devrait être testé dans le cadre de ses propres tests unitaires.