微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

android – 用于测试rxjava的书面单元测试,但不确定我的单元测试是否测试了所有内容

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)这个方法的一部分吗?

解决方法:

这是一个非常小的方法,不包含很多要测试的东西.两个外部依赖项(loginAPIService和loginResponseDomainMapper)减少了要测试的内容.

所以,

1)loginResponseDomainMapper不是测试方法的一部分,也应该被模拟.

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

>首先:检查LoginRequestEntity是否已正确构造并传递给loginUserPost方法.这是通过验证(loginAPIService).loginUserPost(loginRequestEntity,“apitoken”)调用来完成的.此外,您可以使用ArgumentCaptor.
>第二:loginUserPost方法输出正确传递给loginResponseDomainMapper.map方法.这可以通过之前的额外验证调用来完成.
>第三:正确返回map方法输出.这是通过assertValue调用完成的.

因此,您只是想验证数据流是否正确,并且在外星人执行期间没有修改任何内容.

3)负面测试.也有很多事情可能出错.如果loginUserPost没有@NotNull注释,则最好处理此函数的null结果.
另外,如果请求不正确怎么办?密码错了,或apitoken已过期?我相信这不会导致悲惨的后果,但你应该对此有所了解.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐