web-dev-qa-db-fra.com

Test unitaire écrit pour tester rxjava, mais pas sûr que mon test unitaire teste tout

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?

4
ant2009

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. 

  • Premièrement: vérifiez si 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 .
  • Deuxièmement: la sortie de la méthode loginUserPost a été correctement transmise à la méthode loginResponseDomainMapper.map. Cela pourrait être fait avec un appel supplémentaire verify comme précédemment.
  • Troisièmement: La sortie de la méthode map a été correctement renvoyée. Ceci est fait par 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.

1
Genetic Forest

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. 

1
Luke