2016-12-11 318 views
0

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

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不同。

回答

0

ON_CALL提供默认操作以在符合预期时运行。因此,除非在EXPECT_CALL中定义的期望得到满足,否则ON_CALL中定义的操作不会触发。 ON_CALL的典型用例是替换您的EXPECT_CALL中的一组相同的WillOnce/WillRepeatedly条款。要使您的代码段工作,它将需要如下所示:

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); 
+0

谢谢,但我的问题没有回答。在这两种情况下,期望都会得到满足,因为我使用相同的输入进行相同的单元测试。 ON_CALL如何不导致my_action被执行,而EXPECT_CALL呢? – Gops

+0

正如我所说的,'ON_CALL'只能在预期通过呼叫完成时运行。如果你没有定义'EXPECT_CALL',那么没有什么可以实现的。 – VladLosev

相关问题