Multithreading HippoMocks线程安全吗?

Multithreading HippoMocks线程安全吗?,multithreading,unit-testing,mocking,hippomocks,Multithreading,Unit Testing,Mocking,Hippomocks,Hippomock是否可以在并发测试用例中使用,如下所示: 同步启动阶段 创建模拟 登记期望值等 并行测试阶段 在mock上调用方法 同步拆卸阶段 验证模拟 我没有找到关于这个问题的明确声明。这里和那里都提到,模拟非虚拟方法会破坏线程安全性()的可能性,或者线程安全性可以很容易地添加(不幸的是,没有实际揭示如何添加)。GoogleMock非常清楚地回答了这个问题(),这样的信息在这里也会很有帮助。不,Hippomock的设计不是线程安全的 但是,如果遵循一些简单规则,您应该能够在多线

Hippomock是否可以在并发测试用例中使用,如下所示:

  • 同步启动阶段

    • 创建模拟
    • 登记期望值等
  • 并行测试阶段

    • 在mock上调用方法
  • 同步拆卸阶段

    • 验证模拟

  • 我没有找到关于这个问题的明确声明。这里和那里都提到,模拟非虚拟方法会破坏线程安全性()的可能性,或者线程安全性可以很容易地添加(不幸的是,没有实际揭示如何添加)。GoogleMock非常清楚地回答了这个问题(),这样的信息在这里也会很有帮助。

    不,Hippomock的设计不是线程安全的

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

  • 在一个线程中按顺序进行设置,并使用一个MockRepository
  • 在不同的线程中使用不同的模拟应该是安全的
  • 当您只使用OnCall()设置时,在不同线程中使用一个模拟是安全的。将它与OnCall().Do()结合使用,您应该能够以这种方式进行大量测试
  • 不要使用ExpectCall-这不安全
  • 更新:好的,我做到了。我为多线程编写了一个小测试

    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);
    }
    
    class-IMulti
    {
    公众:
    虚空A()=0;
    虚拟整数B(整数a)=0;
    };
    const int THREAD_迭代次数=1000;
    静态DWORD WINAPI运行线程(LPVOID参数)
    {
    IMulti*im=static_cast(args);
    对于(int i=0;iA();
    int result=im->B(22);
    
    cout Hippomocks使用包含唯一(静态)的
    MockReposeInstanceHolder
    MockRepository
    的实例,如回答者所述,它使Hippomock成为非线程安全的。它仅从C函数的上下文中使用MockReposeCholder,否则无法存储mock repo。所有常规mock都有自己的实例指针,从vtable中检索。请注意,其余的mock repository不是线程安全的。
    for (int i = 0; i< THREAD_ITERATIONS*2; i++)
    {
        mocks.ExpectCall(im, IMulti::B).Return(i);
    }