使用google mock,我如何指定一个EXPECT_CALL,返回值N次,然后是一个不同的值N+1?
让我的测试通过的唯一方法是手动指定每次迭代,例如:
EXPECT_CALL(mock, Read(address)).Times(5)
.WillOnce(Return(0))
.WillOnce(Return(0))
.WillOnce(Return(0))
.WillOnce(Return(0))
.WillOnce(Return(1));
字符串
测试说明
被测代码使用状态字来确定是否应该退出阅读数据的循环。EXPECT_CALL应该设置一个期望值,使模拟方法Read()N次返回1,并在第N个周期返回0,以指示没有更多数据。
不幸的是,有问题的代码是在一个单独的机器上,但这里有一个代表性的例子。
const unsigned int statusAddress = 0;
const unsigned int dataAddress = 1;
const unsigned int maxData = 8;
unsigned int dataBuffer[maxData] = {0};
int readIndex = 0;
// Check if data is available (read returns 1).
unsigned int dataIsAvailable = Read(statusAddress);
// Keep reading data until no more is available or the buffer is full.
while ((dataIsAvailable == 1) && (readIndex < maxData))
{
// Read data word.
dataBuffer[readIndex++] = Read(dataAddress);
// Read status to determine if more data is available.
dataIsAvailable = Read(statusAddress);
}
型
Read方法被嘲笑。
如果我按顺序添加期望,则使用后一个EXPECT_CALL(我假设WillOnce在Google代码中覆盖了WillRepeatly)。
EXPECT_CALL(mock, Read(address)).Times(4).WillRepeatedly(Return(1));
EXPECT_CALL(mock, Read(address)).Times(1).WillOnce(Return(0));
Expected: to be called 4 times
Actual: never called - unsatisfied and active
的字符串
因为没有办法...
WillN(Return(1), 4)
型
.我假设有一种不太固定的方式来构造更复杂和/或更长的数据序列的EXPECT_CALL?
2条答案
按热度按时间pftdvrlh1#
有一个简单的方法可以解决你的问题。在你的期望之前创建一个InSequence的示例。这将保证以相同的顺序调用编写的期望。
字符串
更多信息:点击
p5fdfcr12#
对于这种类型的测试,您可能需要研究委托调用到假模式。
我想如果我需要实现一套处理阅读各种数据流的测试,我可能会编写一个混合的Mock/Fake类,允许我控制要读取的实际流。例如:
字符串
请注意,这个例子并没有遵循上面链接的Google Mock cookbook模式。完整的cookbook模式将让您创建一个
FakeReader
类以及一个MockReader
。MockReader
将拥有并委托给FakeReader
类的私有示例。您还可以考虑将fake放入fixture类中。