gpt4 book ai didi

java - 用 Mockito 验证一个函数被调用的次数有什么意义?

转载 作者:太空狗 更新时间:2023-10-29 22:53:56 27 4
gpt4 key购买 nike

在我的理解中,代码测试就是测试结果是否正确,就像计算器一样,我需要写一个测试用例来验证1+1的结果是否为2。

但是我看过很多关于验证方法调用次数的测试用例。我对此很困惑。最好的例子是我刚刚在 Spring in Action 中看到的:

public class BraveKnight implements Knight {
private Quest quest;
public BraveKnight(Quest quest) {
this.quest = quest;
}
public void embarkOnQuest() {
quest.embark();
}
}

public class BraveKnightTest {
@Test
public void knightShouldEmbarkOnQuest() {
Quest mockQuest = mock(Quest.class);
BraveKnight knight = new BraveKnight(mockQuest);
knight.embarkOnQuest();
verify(mockQuest, times(1)).embark();
}
}

我真的不知道为什么他们需要验证调用了一次 embark() 函数。你不觉得调用embarkOnQuest()之后一定会调用embark()吗?或者会出现一些错误,我会在日志中注意到错误信息,其中显示错误行号,可以帮助我快速定位错误代码。

那么像上面那样验证有什么意义呢?

最佳答案

需求很简单:验证调用次数是否正确。在某些情况下不应发生方法调用,而在其他情况下应该或多或少地发生方法调用。

考虑以下 embarkOnQuest 的修改版本:

public void embarkOnQuest() {
quest.embark();
quest.embarkAgain();
}

假设您正在为 quest.embark() 测试错误情况:

@Test 
public void knightShouldEmbarkOnQuest() {
Quest mockQuest = mock(Quest.class);
Mockito.doThrow(RuntimeException.class).when(mockQuest).embark();
...
}

在这种情况下,您要确保 quest.embarkAgain 未被调用(或被调用 0 次):

verify(mockQuest, times(0)).embarkAgain(); //or verifyZeroInteractions

当然这是另一个简单的例子。还有许多其他示例可以添加:

  • 应在第一次获取时缓存条目的数据库连接器,可以进行多次调用并验证与数据库的连接是否仅被调用一次(每个测试查询)
  • 一个在加载时(或懒惰地)进行初始化的单例对象,可以测试与初始化相关的调用是否只进行一次。

关于java - 用 Mockito 验证一个函数被调用的次数有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52222264/

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