gpt4 book ai didi

java - 单元测试断言与 Mockito.verify()

转载 作者:行者123 更新时间:2023-11-29 07:25:20 25 4
gpt4 key购买 nike

摆弄 Mockito 来实现我的服务的单元测试,但出于某种原因,我无法通过我厚实的头骨来完成它。我的测试通过了,但我不相信我做对了。

这是我测试 count() 方法的示例。该方法只是将调用转发到其存储库,我不想验证仅此而已,没有其他任何事情发生。这是我得到的:

@RunWith(MockitoJUnitRunner.class)
public class PersonServiceImplTest {

@Mock
private PersonRepository personRepository;

@InjectMocks
private PersonServiceImpl personService;

@Test
public void testCount() {

when(personRepository.count()).thenReturn(2L);

long count = personService.count();

assertEquals(2L, count);

verify(personRepository).count();
}
}

我的测试通过了,但我有一些问题。

  1. 是否需要 assertEquals?据我了解,无论我把什么作为方法 stub (.thenReturn(value..)) 的预期结果,都将始终是返回的值。或者在这种情况下可能是其他原因?

  2. 我需要验证吗?我觉得我这样做是因为我想验证是否确实调用了 personRepository.count() 。或者当我也有 assertEquals() 时那是多余的吗?

  3. 我需要同时使用 assertEquals 和 verify 吗?

  4. 最后,我这样做对吗:)

谢谢

最佳答案

是的,你做对了。

您正在将模拟存储库注入(inject)到真实服务中,然后测试该服务。当涉及到服务中的业务逻辑时,任何事情都可能发生。这就是为什么使用已知输入和已知输出来验证代码很重要,就像您正在做的那样。

  1. 根据存储库的响应,您正在检查业务逻辑的结果。这个特定的代码相当简单,但想象一下,如果业务逻辑提供的是平均值或总和,而不仅仅是存储库提供的相同值。

  2. 和 3. verify 和 assertEquals 正在测试不同的东西。 verify 检查您的存储库方法是否被调用,assert 检查服务是否以正确的值响应。想象一下,您的服务方法有一个硬编码的 return 2L。 assertEquals 会通过,但验证会失败。

  3. 是的,你做对了。您测试的内容与您测试的原因相关联。是否需要特定断言或验证通常取决于具体情况。在这种情况下,测试您的存储库方法是否返回 2L 没有什么意义,但是测试您的服务是否返回 2L 是一个很好的案例。同样,测试服务方法是否已被调用没有意义,但测试存储库方法是否已被调用是一个很好的案例。

您现在拥有测试服务的工具,下一步是确定要编写哪些测试。

关于java - 单元测试断言与 Mockito.verify(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54296436/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com