【问题标题】:ON_CALL does not work but EXPECT_CALL worksON_CALL 不起作用,但 EXPECT_CALL 起作用
【发布时间】:2016-12-11 09:48:53
【问题描述】:

我有一个单元测试代码,其中我有一个函数 foo 的模拟。当我使用 ON_CALL 构造来指定动作时,它不执行 my_action 而只是执行 foo。

ON_CALL(my_mock, foo(my_matcher()))
.WillByDefault(DoAll(my_action(), Return(0)));

但是当我执行 EXPECT_CALL 时,它会起作用。就我而言, foo() 只被调用一次。我试着看看它会有什么不同。但是谷歌搜索或搜索 stackoverflow 并没有帮助。下面是有效的 EXPECT_CALL:

EXPECT_CALL(my_mock, foo(my_matcher()))
.WillOnce(DoAll(my_action(), Return(0)));

在 my_matcher 和 my_action 相同的情况下,我不明白它们有何不同。

【问题讨论】:

    标签: unit-testing googlemock


    【解决方案1】:

    ON_CALL 提供了在满足期望时运行的默认操作。因此,除非满足 EXPECT_CALL 中定义的期望,否则 ON_CALL 中定义的操作不会触发。 ON_CALL 的典型用例是替换 EXPECT_CALLs 中的一组相同的 WillOnce/WillRepeatedly 子句。为了使您的 sn-p 工作,它需要如下所示:

    ON_CALL(my_mock, foo(_))
      .WillByDefault(DoAll(my_action(), Return(0)));
    EXPECT_CALL(my_mock, foo(my_matcher())).Times(1);
    EXPECT_CALL(my_mock, foo(my_other_matcher())).Times(1);
    

    【讨论】:

    • 谢谢,但我的问题没有得到解答。在这两种情况下,都满足了期望,因为我正在使用相同的输入运行相同的单元测试。 ON_CALL 如何不会导致 my_action 被执行而 EXPECT_CALL 会?
    • 正如我所说,ON_CALL 只能在调用满足期望时运行。如果不定义EXPECT_CALL,就没有什么可实现的。
    猜你喜欢
    • 2019-06-15
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多