如何混合CBD和RAII

时间:2010-06-15 20:24:40

标签: c++ tdd raii

我正在尝试为我的新项目进行大量测试,但我遇到了问题。

基本上我想测试MyClass。 MyClass使用了其他几个我不需要/想要为测试目的而做的工作。所以我创建了模拟(我使用gtest和gmock进行测试)

但是MyClass在它的构造函数中实例化它需要的所有内容并在析构函数中释放它。我认为这是RAII。

所以我想,我应该创建一些工厂,它创建所有东西并将它提供给MyClass的构造函数。该工厂可能因为测试目的而伪造。但那不再是RAII吧?

那么这里有什么好的解决方案?

1 个答案:

答案 0 :(得分:2)

你嘲笑它就像你嘲笑任何其他类一样。让RAII类的构造函数处理它。

class MyInterface
{
    virtual void MyApiFunction(int myArg)
    {
        ::MyApiFunction(myArg);
    }
};

class MyRAII : boost::noncopyable //Shouldn't be copying RAII classes, right?
{
    MyInterface *api;
public:
    MyRAII(MyInterface *method = new MyInterface)
    : api(method)
    {
        //Aquire resource
    }
    ~MyRAII()
    {
        //Release resource
        delete api;
    }
};

class MockInterface : public MyInterface
{
    MOCK_METHOD1(MyApiFunction, void(int));
};

TEST(Hello, Hello)
{
    std::auto_ptr<MockInterface> mock(new MockInterface);
    EXPECT_CALL(*mock, ....)...;
    MyRAII unitUnderTest(mock.release());
}