这样的单元测试有什么好处?

What is the gain of a unit test like this?

一个看不懂有用的测试用例(摘自Plaid):

这里有什么意义?通过这一行,您已经告诉您的框架在调用 getUsers() 方法时 return 一个预定义的结果,然后您验证它实际上 return 是一个预定义的结果。 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 模式的看法是,它本来是在极少数情况下使用的,但现在却被滥用了

在这种情况下,测试的是 dataSourcegetUsers 方法,而不是 servicegetUsers 方法。

假设 dataSource.getUsers 方法有副作用 - 它在后台调用 service.getUsers

此测试检查 4 件事:

  1. 调用 service.getUsers 实际上发生在我们调用 dataSource.getUsers
  2. 只发生一次
  3. dataSource.getUsers 正确地将其输入参数转换为 service.getUsers 的输入参数(listOf(111L, 222L) 转换为 "111,222"
  4. 值 return 来自这个内部调用的值不会被丢弃,而是正确地用于产生整体 return 值(在这种情况下它只是 returned 原样)