编辑2
这个
DoDefault()
-功能与问题中的问题很接近。它指定
EXPECT_CALL
应返回到由指定的默认操作
ON_CALL
以下内容:
using ::testing::DoDefault;
// Default action
ON_CALL(*connectionMock, open(_, _)).WillByDefault(Return(true));
// returns true once and then goes back to the default action
EXPECT_CALL(*connectionMock, open(_, _)
.WillOnce(Return(false))
.WillRepeatedly(DoDefault());
初步答复
如果
IConnection::open
取决于您可以指定的参数
随叫随到
两次,但参数不同(或者更确切地说,参数不是占位符):
ON_CALL(*connectionMock, open(_, _)).WillByDefault(Return(true));
ON_CALL(*connectionMock, open("BAD_ADDRESS", 20)).WillByDefault(Return(false));
所以不管什么时候
open
将用参数“bad_address”和20调用,它将返回false,否则返回true。
下面是一个简单的例子:
using ::testing::_;
using ::testing::AnyNumber;
using ::testing::Return;
class A {
public:
virtual bool bla(int a) = 0;
};
class MOCKA : public A {
public:
MOCK_METHOD1(bla, bool(int));
};
TEST(ABC, aBABA) {
MOCKA a;
ON_CALL(a, bla(_)).WillByDefault(Return(false));
ON_CALL(a, bla(1)).WillByDefault(Return(true));
EXPECT_CALL(a, bla(_)).Times(AnyNumber());
EXPECT_TRUE(a.bla(1));
EXPECT_TRUE(a.bla(1));
EXPECT_TRUE(a.bla(1));
EXPECT_FALSE(a.bla(2));
EXPECT_FALSE(a.bla(3));
EXPECT_FALSE(a.bla(4));
}
编辑1
我想现在我明白了这个问题,如果我明白了,那么解决方法就非常简单:
EXPECT_CALL(*connectionMock, open(_, _))
.Times(AnyNumber())
.WillOnce(Return(true))
.WillRepeatedly(Return(false));
什么时候?
ConnectionMock::open
将在内部调用
MySystem::doSth
它一回来
true
然后总是回来
false
不管争论是什么。在这种情况下,您也不需要指定
随叫随到
是的。或者你真的需要用
随叫随到
而不是
期待您的来电
是吗?