首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Googlemock暂停期望

Googlemock暂停期望
EN

Stack Overflow用户
提问于 2021-05-12 15:24:12
回答 3查看 91关注 0票数 1

我有一个场景,我希望对模拟对象上的函数进行一些调用,然后对于特定的代码路径,我需要确保该函数不被调用,然后,它被调用。有没有办法做到这一点?

代码语言:javascript
复制
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中实现这一点的任何方法吗?

EN

回答 3

Stack Overflow用户

发布于 2021-05-12 18:09:16

Gmock cookbook建议使用虚拟检查点模拟函数

代码语言:javascript
复制
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

票数 3
EN

Stack Overflow用户

发布于 2021-05-12 15:51:50

我会把它分成几个测试用例:

代码语言:javascript
复制
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);
}
票数 2
EN

Stack Overflow用户

发布于 2021-05-12 15:59:44

你想得到这样的东西吗?

代码语言:javascript
复制
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 #3
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67499003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档