代码之家  ›  专栏  ›  技术社区  ›  ant2009

为测试rxjava编写的单元测试,但不确定我的单元测试是否测试了所有东西

  •  4
  • ant2009  · 技术社区  · 7 年前
    Android Studio 3.4
    

    LoginResponseEntity 将被映射并返回 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)
                    }
        }
    

         @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"))
        }
    

    我还能做什么来测试这个方法吗。我应该测试一下 .map{loginResponseDomainMapper.map(it) 这方法的一部分?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Feedforward    7 年前

    这是一个非常小的方法,不包含很多要测试的东西。两个外部依赖项( loginAPIService loginResponseDomainMapper

    所以,

    (一) 登录响应域映射器 不是测试方法的一部分,也应该被模拟。

    2) 你必须明白,这里应该测试什么。

    • LoginRequestEntity 正确构造并传递给 loginUserPost 方法。这是由 verify(loginAPIService).loginUserPost(loginRequestEntity, "apitoken") ArgumentCaptor .
    • 第二:输出 登录服务器 方法已正确传递给 loginResponseDomainMapper.map verify 像以前一样打电话。
    • 第三:正确返回了map方法的输出。这是由 assertValue

    所以,您只是试图验证数据流是正确的,并且在执行期间没有被外星人或类似的东西修改。

    3) 阴性测试。也没有多少事情会出错。如果 没有 @NotNull 注释,你最好处理 null
    另外,如果请求不正确怎么办?密码错误,或 apitoken

        2
  •  1
  •   Luke    7 年前

    您可以为不成功的方案添加测试:

    1) 如果 loginUserPost

    whenever(loginAPIService.loginUserPost(any(), any())).thenReturn(Single.error(Exception()))
    ...
       .test()
       .assertError(...)
    

    2) 如果 loginResponseDomainMapper 失败时,可以添加:

    whenever(loginResponseDomainMapper.map(any())).thenThrow(Exception())
    ...
           .test()
           .assertError(...)
    

    这样,您就可以测试不成功/成功的映射和函数输出,而无需详细说明。 行为应该在自己的单元测试范围内进行测试。