unit-testing - 这样的单元测试有什么好处?
问题描述
一个我无法理解有用性的测试用例(取自Plaid):
这里有什么意义?通过这一行,您已经告诉您的框架在getUsers()
调用方法时返回预定义结果,然后验证它是否实际返回预定义结果。
whenever(service.getUsers("111,222")).thenReturn(Response.success(users))
@Test
fun getUsers_withSuccess() = runBlocking {
// Given that the service responds with success
whenever(service.getUsers("111,222")).thenReturn(Response.success(users))
// When requesting the users
val result = dataSource.getUsers(listOf(111L, 222L))
// Then there's one request to the service
verify(service).getUsers("111,222")
// Then the correct set of users is returned
assertEquals(Result.Success(users), result)
}
我看到这个确切的测试用例的方式是:
@Test
fun getUsers_withSuccess() = runBlocking {
val a = 4;
assertEquals(a, 4)
}
这两个测试用例有何不同,以及 Plaid 的用例如何测试任何有用的东西,我的意思是该测试用例可以捕获什么错误?这个测试用例中是否有我遗漏的大图?
注意:我看到该whenever {something} return
模式的方式是在极少数情况下使用它,但正在被滥用
解决方案
在这种情况下,测试的是getUsers
方法dataSource
,而不是getUsers
方法service
。
假设该dataSource.getUsers
方法具有副作用-它service.getUsers
在后台调用。
该测试检查 4 件事:
- 当我们调用时,调用
service.getUsers
实际上发生了dataSource.getUsers
- 它只发生一次
dataSource.getUsers
正确地将其输入参数转换为输入参数 forservice.getUsers
(listOf(111L, 222L)
into"111,222"
)- 从这个内部调用返回的值不会被丢弃,而是正确地用于产生整体返回值(在这种情况下,它只是按原样返回)