我有一个场景,我希望对模拟对象上的函数进行一些调用,然后对于特定的代码路径,我需要确保该函数不被调用,然后,它被调用。有没有办法做到这一点?
EXPECT_CALL(mockObj, 1);
foo(1);
// Expect this call at the first invocation of foo(2)
EXPECT_CALL(mockObj, 2);
foo(2);
// These calls should not call my mockObj again, the above expectation is
// intended for the first invocation of foo(2)
foo(2);
foo(2);
// And now, i expect it to be called
EXPECT_CALL(mockObj, 3);
foo(3);我可以检查EXPECT_CALL(mockObj,2);是否只被调用了预期次数,但我还想确认它只在第一次调用foo(2)时调用,而不是在随后调用foo(2)时调用。你能让我知道在gmock中实现这一点的任何方法吗?
发布于 2021-05-12 18:09:16
Gmock cookbook建议使用虚拟检查点模拟函数
using ::testing::MockFunction;
TEST(FooTest, InvokesMyMockCorrectly) {
MyMock mockObj;
// Class MockFunction<F> has exactly one mock method. It is named
// Call() and has type F.
MockFunction<void(string check_point_name)> check;
{
InSequence s;
EXPECT_CALL(mockObj, 1);
EXPECT_CALL(check, "1");
EXPECT_CALL(mockObj, 2);
EXPECT_CALL(check, "2");
EXPECT_CALL(check, "3");
EXPECT_CALL(mockObj, 3);
}
foo(1);
check.Call("1");
foo(2);
check.Call("2");
foo(2);
foo(2);
check.Call("3");
foo(3);
}或者使用Mock::VerifyAndClearExpectations()重置模拟,然后设置新的期望。
否则,像某些答案中建议的那样,交叉调用模拟和EXPECT_CALLs是未定义的行为:
重要说明: gMock要求在调用模拟函数之前设置期望,否则行为是未定义的。特别是,您不能交错EXPECT_CALL()和对模拟函数的调用。
来自gmock for dummies,也请参阅Interleaving EXPECT_CALL()s and calls to the mock functions
发布于 2021-05-12 15:51:50
我会把它分成几个测试用例:
TEST(Foo, CalledOnFirstInvoation) {
EXPECT_CALL(mockObj, 1);
foo(1);
}
TEST(Foo, CalledAgainWhenUsingDifferenArgument) {
EXPECT_CALL(mockObj, 2);
foo(1);
foo(2);
}
TEST(Foo, NotCalledWhenUsingSameArgument) {
EXPECT_CALL(mockObj, 2);
foo(1);
foo(2);
foo(2);
foo(2);
}
TEST(Foo, CalledAgainWhenUsingYetAnotherArgument) {
EXPECT_CALL(mockObj, 3);
foo(1);
foo(2);
foo(2);
foo(3);
}发布于 2021-05-12 15:59:44
你想得到这样的东西吗?
EXPECT_CALL(mockObj, 1).Times(0);
EXPECT_CALL(mockObj, 2).Times(0); // #2
EXPECT_CALL(mockObj, 3); // #3
{
EXPECT_CALL(mockObj, 1); // #1
foo(1); // Matches #1
}
{
EXPECT_CALL(mockObj, 2); // #4
// Expect this call at the first invocation of foo(2)
foo(2); // Matches #4
}
// These calls should not call my mockObj again, the above expectation is
// intended for the first invocation of foo(2)
foo(2); // Matches #2
foo(2); // Matches #2
// And now, i expect it to be called
foo(3); // Matches #3https://stackoverflow.com/questions/67499003
复制相似问题