c++ - 在 gmock 的 EXPECT_CALL 中调用 sleep()

标签 c++ unit-testing googletest googlemock

我试图在调用 FuncHelper 之前在 .WillOnce 中做一些 sleep 。所以我需要类似于以下内容的内容:

EXPECT_CALL(*_mock, Func(_,_,_)).Times(1)
  .WillOnce(DoAll(InvokeWithoutArgs(sleep(TimeToSleep)), 
                  Invoke(_mock, &M_MyMock::FuncHelper)));

是否可以在 .DoAll 中使用 arg 调用 sleep()? C++98 是首选。

更新:

该解决方案基于@Smeeheey 的回答并使用 C++98。

template <int N> void Sleep ()
{
  sleep(N);
}
...
EXPECT_CALL(*_mock, Func(_,_,_)).Times(1)
  .WillOnce(DoAll(InvokeWithoutArgs(Sleep<TimeToSleep>), 
                  Invoke(_mock, &M_MyMock::FuncHelper)));

最佳答案

既然你说 C++98 是可取的而不是强制性的,那么首先我会给出一个简洁的 C++11 答案:

EXPECT_CALL(*_mock, Func(_,_,_)).Times(1)
  .WillOnce(DoAll(InvokeWithoutArgs([TimeToSleep](){sleep(TimeToSleep);}), 
                  Invoke(_mock, &M_MyMock::FuncHelper)));

否则(对于 C++98),在代码的其他地方定义一个包装函数:

void sleepForTime()
{
    sleep(TimeToSleep);
}

然后:

EXPECT_CALL(*_mock, Func(_,_,_)).Times(1)
  .WillOnce(DoAll(InvokeWithoutArgs(sleepForTime), 
                  Invoke(_mock, &M_MyMock::FuncHelper)));

请注意,TimeToSleep 必须是一个全局变量。

编辑:根据评论中 OP 的建议,如果 TimeToSleep 是编译时常量,您可以避免使用全局变量:

template <int Duration>
void sleepForTime()
{
    sleep(Duration);
}

...

EXPECT_CALL(*_mock, Func(_,_,_)).Times(1)
  .WillOnce(DoAll(InvokeWithoutArgs(sleepForTime<TimeToSleep>), 
                  Invoke(_mock, &M_MyMock::FuncHelper)));

关于c++ - 在 gmock 的 EXPECT_CALL 中调用 sleep(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37678844/

相关文章:

c++ - GoogleTest Framework 似乎不适用于 Lambda 函数(跟进)

c++ - Qt 图表 - 如何在 x 和 y 轴上显示特定点值?

c++ - Redo char 未声明但已声明

jenkins - 在 Jenkins 中使用 gtest

python - 单元测试中如何强调对输入数据的限制?

javascript - 模拟 net.Socket 进行单元测试

c++ - Gmock 参数化测试运行两次

c++ - 在不初始化数据的情况下调整 C++ std::vector<char> 的大小

c++ - 将重载函数与其多态参数匹配

.net - 如何对 winforms 应用程序进行单元测试