如果我在同一个模拟对象上调用 EXPECT_CALL
两次 TEST_F
。 . .怎么了?
是附加到模拟对象的期望还是第二次调用消除了第一次调用的影响?
我发现 After Clause 似乎暗示允许多次调用同一个模拟 + EXPECT_CALL。
原文由 Bob 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果我在同一个模拟对象上调用 EXPECT_CALL
两次 TEST_F
。 . .怎么了?
是附加到模拟对象的期望还是第二次调用消除了第一次调用的影响?
我发现 After Clause 似乎暗示允许多次调用同一个模拟 + EXPECT_CALL。
原文由 Bob 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答3.3k 阅读
是的,您可以在同一个模拟对象上多次调用
EXPECT_CALL
。只要您确保在实际使用模拟方法之前调用了所有EXPECT_CALL
。否则,您的测试将依赖于未定义的行为。来自 ForDummies :如何处理多个呼叫?文档非常简单。来自 ForDummies :
让我们通过检查一些示例来考虑这对 gMock 用户意味着什么。我假设我们有一个带有以下标题的文件:
通过多次调用
EXPECT_CALL
的测试的最简单示例:测试直观地工作:
call#1
不匹配exp#2
所以exp#1
被尝试和匹配。call#2
与exp#2
匹配。两个调用只匹配一次,因此它们被认为是满意的并且测试通过了。
当多个
EXPECT_CALL
能够匹配调用时,棘手的部分就开始了。让我们考虑以下示例:call#1
匹配exp#2
。 gMock 在第一次匹配预期时停止,它根本不会检查exp#1
。call#2
匹配exp#2
。再次,exp#1
没有机会匹配。结果测试失败,因为
exp#2
匹配了两次而不是一次,并且exp#1
根本不匹配。测试输出中打印的所有内容:此外,重要的是,添加新的期望值不会禁用或删除旧的期望值。他们仍然能够通过您的测试!
call#1
和call#2
都匹配exp#2
。结果exp#2
得到满足,但测试将失败,因为exp#1
没有足够的匹配次数。如果出于某种原因,您需要编写类似
TheSameArgumentsGoingToFail
的测试,您可以使用多种技术来防止exp#2
第二次匹配。请参考文档 InSequence 用法, RetiresOnSaturation :