首页 > 解决方案 > 这样的单元测试有什么好处?

问题描述

一个我无法理解有用性的测试用例(取自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模式的方式是在极少数情况下使用它,但正在被滥用

标签: unit-testingkotlinjunit

解决方案


在这种情况下,测试的是getUsers方法dataSource,而不是getUsers方法service

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

该测试检查 4 件事:

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

推荐阅读