- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
Important note: Google Mock requires expectations to be set before the mock functions are called, otherwise the behavior is undefined. In particular, you mustn't interleave EXPECT_CALL()s and calls to the mock functions.
有人知道这个限制背后的任何细节吗?然而,我有许多单元测试肯定违反了这条规则,但似乎运行正常。
最佳答案
EXPECT_CALL()
和对模拟函数的调用是未定义的行为(由谷歌确认,gmock 的制造商,here)
我不同意 @Marko Popovic's assessment 的观点,并且相信他所做的是碰巧有效的未定义行为。 我亲眼看到他在做什么,交错调用,看起来工作正常。但我认为这是未定义的行为。
尽管如此,我需要谷歌的澄清,所以我在这里打开了这个问题:https://github.com/google/googletest/issues/2828。请给它投票以引起注意,因为我希望 Googletest 团队自己澄清这一点。
更新:Google has responded,并声明@Marko Popovic 的回答依赖于未定义的行为。然而,这是一个非常常见的陷阱,因为正如 Marko 指出的那样,而且正如我所看到的那样,它确实有效(至少在大多数时候是这样)。问题在于它依赖于未定义的 gmock 行为。
undefined behavior 的问题是它经常工作,但在技术上不正确,可能有错误,可能导致不稳定的测试,并且在将来 gmock 更新时可能会因未知原因而中断在将来。简而言之:未定义的行为不是面向 future 的,也不是跨平台的。它也可能导致竞争条件或不总是有效。因此,不要这样做。听谷歌。他们陈述以下内容的陈述实际上是正确的:
In particular, you mustn't interleave
EXPECT_CALL()
s and calls to the mock functions (https://github.com/google/googletest/blob/master/googlemock/docs/for_dummies.md#using-mocks-in-tests)
回到我原来的答案:
在我的另一个回答中,我谈了很多很多关于如何正确使用多个 EXPECT_CALL()
的问题,我声明交错是不行的:google mock - can I call EXPECT_CALL multiple times on same mock object?
Here is a quote from my own writing :
Question 3: Can I call
EXPECT_CALL
to set some expectations on a mock method, call the mock method, then callEXPECT_CALL
on the method again to change the expectations, then call the mock method again?This question wasn't even explicitly asked by the OP, but the only reason I found this page is because I was searching for this answer for many hours and couldn't find it. My Google search was "[gmock multiple expect_call][10]." Therefore, others asking this question will also fall on this page and need a conclusive answer.
A: NO, you can NOT do this! Although it may seem to work in testing, according to Google, it produces undefined behavior. See general rule #2 above!
"Important note: gMock requires expectations to be set before the mock functions are called, otherwise the behavior is undefined. In particular, you mustn't interleave
EXPECT_CALL()
s and calls to the mock functions" (https://github.com/google/googletest/blob/master/googlemock/docs/for_dummies.md#using-mocks-in-tests)因此,这是不允许的!
来自:https://google.github.io/googletest/gmock_cheat_sheet.html#verifying-and-resetting-a-mock(已强调):
Do not set new expectations after verifying and clearing a mock after its use. Setting expectations after code that exercises the mock has undefined behavior. See Using Mocks in Tests for more information.
(感谢 @nnovich-OK for pointing the above quote out in the comments )。
此外,从这里:https://google.github.io/googletest/gmock_for_dummies.html#using-mocks-in-tests(原始引用中的原始重点):
Important note: gMock requires expectations to be set before the mock functions are called, otherwise the behavior is undefined. Do not alternate between calls to
EXPECT_CALL()
and calls to the mock functions, and do not set any expectations on a mock after passing the mock to an API.This means
EXPECT_CALL()
should be read as expecting that a call will occur in the future, not that a call has occurred. Why does gMock work like that? Well, specifying the expectation beforehand allows gMock to report a violation as soon as it rises, when the context (stack trace, etc) is still available. This makes debugging much easier.
因此,以下也是未定义的 gmock 行为:
也许这不是未定义的行为!?我添加的只是 Mock::VerifyAndClearExpectations(&myMockObj)
。
TEST(FooTest, testCaseName)
{
MyMock myMockObj;
...
EXPECT_CALL(myMockObj, myMethod(_)).WillOnce(Return(true));
testMethod();
ASSERT_THAT(...);
Mock::VerifyAndClearExpectations(&myMockObj); // <== NOTICE THIS ADDED LINE!
EXPECT_CALL(myMockObj, myMethod(_)).WillOnce(Return(false));
testMethod();
ASSERT_THAT(...);
}
关于c++ - 交织 EXPECT_CALL() 和对模拟函数的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40089204/
A 类正在测试中,我希望 EXPECT_CALL 立即返回,并为模拟的 asyncfunc() 方法调用值为 200(右值引用)的 lamda 函数。请阅读符合代码的注释 #include "gtes
我的 mock 定义如下: template class ParseTreeMock : public ParseTreeInterface { public: MOCK_ME
有没有办法在函数的局部对象上使用 EXPECT_CALL? 例如: template std::string doSomethingWithTheCar() { T car; retu
我知道 EXPECT_CALL 应该用于模拟类及其对象/方法。但是有没有可能使用它来期望调用本地方法? void Sample::Init() { // some codes here...
我正在使用 gtest & gmock 并希望对使用集合调用的函数设置期望值。我想确保这个集合包含多个元素。 像这样: EXPECT_CALL(*mView, SetHighlightedCells(
我有一个类通过调用 subscribe(callbackfunction) 来“订阅”来自组件的信号。我现在正尝试通过保存回调并稍后向其发送数据以测试该组件的其他部分来使用 gtest/gmock 测
我有一个类,其中包含几个相互依赖的方法。让我们说 foo()、bar() 和 baz()。 当我测试 bar() 时我需要模拟 foo() 的行为,当我测试 baz() 时我需要模拟 bar() 的行
我有一个用于串行接口(interface)的简单模拟类: class MockSerialPort : public drivers::SerialPort { public: MockS
我有一些期望,比如 EXPECT_CALL (...) EXPECT_CALL(t1, foo()).Times(1); 我想创建相反的。 我期望某个函数不会被执行 . 我应该使用什么方法? 类似 E
我有两个模拟。一次运行只应调用其中一个,我想在不知道给定先决条件的情况下使用期望来确定 execute() 函数是否成功。 如何实现? Mock1 successMock; Mock2 failMoc
#include "gtest\gtest.h" using namespace testing; class MyGTest : public Test { public: void f()
我有一个类,其构造函数调用一个成员函数,该成员函数又调用其他成员函数。我想使用 GMock 创建一个模拟类,并验证在构造模拟类对象时,这些成员函数在构造过程中被调用了一次。但我观察到以下困境: 一方面
我是 Gmock 的新手。我尝试了一个例子,但它是错误的。我也引用了该组的一些帖子,但对我没有帮助。 class MATH { public: virtual ~MATH(){} virt
测试用例应断言调用了资源的方法tagcache(),以确保更新资源的标签缓存。我知道调用了该方法,但测试失败,因为: Expected: to be called at least once Actu
我在 C 中有以下代码想使用谷歌测试框架进行测试: a.h void getValue(int age, int * value); a.c #include void getValue(int a
我刚刚开始使用 GoogleTest 和 GoogleMock。阅读"for dummies" documentation该示例测试依赖于 Turtle 的 Painter 类: 真实对象-Turtl
Google Mock documentation说: Important note: Google Mock requires expectations to be set before the m
我必须遵循模拟函数 DoSomething(const char* par0, const char* par2) DoSomething2(std::string); 我将 DoSomething
struct obj { int a; string str; string str2; bool operator==(const obj& o) const { if
我对 Google Mock 还是很陌生,所以边学边学。我刚刚添加了一些单元测试,但遇到了一个问题,我无法让 ON_CALL() 正确地 stub 从方法内部调用的方法。 下面的代码概述了我所拥有的;
我是一名优秀的程序员,十分优秀!