首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HippoMocks线程安全吗?

HippoMocks线程安全吗?
EN

Stack Overflow用户
提问于 2016-07-29 08:47:59
回答 1查看 212关注 0票数 1

在并发测试用例中是否可以像这样使用HippoMocks:

  1. 同步启动阶段
代码语言:javascript
复制
- create mock
- register expectations etc.

  1. 并行测试阶段
代码语言:javascript
复制
- call methods on the mock

  1. 同步拆卸相位
代码语言:javascript
复制
- verify the mock

我没有找到关于这个问题的明确声明。这里和那里都提到过,模拟非虚拟方法会破坏线程安全(HippoMocks: is it possible to mock non-virtual methods?)的可能性,或者线程安全可以很容易地添加(不幸的是,并没有透露具体的方法)。GoogleMock非常清楚地回答了这个问题(https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md#using-google-mock-and-threads),这样的信息在这里也会有所帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-04 10:11:28

不,HippoMocks不是为线程安全而设计的。

但是,如果您遵循一些简单的规则,您应该能够在多线程环境中使用模拟:

  1. 在一个线程中按顺序执行设置,并使用一个MockRepository。
  2. 在不同的线程中使用不同的模拟应该是安全的。
  3. 当您只使用OnCall()设置时,在不同线程中使用一个模拟是安全的。将其与OnCall().Do()相结合,您应该能够以这种方式进行大量测试。
  4. 不要使用ExpectCall -这是不安全的。

更新:好了,我做到了。我为多线程编写了一个小测试。

代码语言:javascript
复制
class IMulti
{
public:
    virtual void A() =0;
    virtual int B(int a) = 0;
};

const int THREAD_ITERATIONS = 1000;

static DWORD WINAPI run_thread(LPVOID args)
{
    IMulti* im = static_cast<IMulti*>(args);
    for (int i=0; i<THREAD_ITERATIONS; i++)
    {
        im->A();
        int result = im->B(22);
        std::cout << "task says: " << i <<" result:" << result <<"\n";
    }

    std:: cout << "finished";

    return 0;
}

TEST(check_HippoMocksCanMultiThreadedConcurrentReadingViaOnCall)
{
    MockRepository mocks;

    IMulti* im = mocks.Mock<IMulti>();

    mocks.OnCall(im, IMulti::A);
    mocks.OnCall(im, IMulti::B).Return(4711);

    HANDLE handles[2];

    handles[0] = CreateThread(NULL, 0, &run_thread, im, 0, NULL);
    handles[1] = CreateThread(NULL, 0, &run_thread, im, 0, NULL);

    WaitForMultipleObjects(2, handles, TRUE, INFINITE);
}

结果是,它工作得很好。现在,我使它变得更加困难,并将第二个OnCall替换为以下内容:

代码语言:javascript
复制
for (int i = 0; i< THREAD_ITERATIONS*2; i++)
{
    mocks.ExpectCall(im, IMulti::B).Return(i);
}

在这里,会随机发生崩溃(只需在THREAD_ITERATIONS计数器上玩一玩)。原因是,匹配的期望在that存储库中以某种方式被计算在内。

如预期的那样,执行设置时会同时崩溃。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38654425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档