c++ - 如何混合使用 CBD 和 RAII

标签 c++ tdd raii

我正在尝试对我的新项目进行广泛的测试,但我遇到了问题。

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

但是 MyClass 在它的构造函数中实例化它需要的一切,并在析构函数中释放它。我认为这就是 RAII。

所以我想,我应该创建某种工厂,它创建所有内容并将其提供给 MyClass 的构造函数。出于测试目的,该工厂可能会伪造它。但这不再是 RAII 了吗?

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

最佳答案

您可以像模拟任何其他类一样模拟它。让 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());
}

关于c++ - 如何混合使用 CBD 和 RAII,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3048761/

相关文章:

c# - 如何为包含 ManualResetEvent.WaitOne() 的异步(套接字)代码编写单元测试?

java - 如何使用mockito测试给定的代码

c++ - 何时不使用 RAII 进行资源管理

c++ - 从函数返回的 void* 指针 - 堆损坏

c++ - 使 C++ std::string 在指定字符处结束?

c++ - 带有 boost::asio::read 的 EOF

c++ - 我的代码怎么了?

c++ - 错误 : expected constructor, 析构函数,或 ‘&’ token 之前的类型转换

unit-testing - 我怎样才能最好地为解析器编写单元测试用例?

c++ - RAII 是什么时候添加到 C++ 中的