c++ - 如何对在测试对象中创建的模拟对象做出期望?

标签 c++ unit-testing boost-test turtle-mock

我想对如下所示的类进行单元测试:

template <typename T>
class MyClass {
...
    void someMethod() {
        T object;
        object.doSomething();
    }
...
};

我想对这个类进行单元测试,所以我为 T 创建了一个模拟类:

struct MockT {
...
    MOCK_METHOD(doSomething, 0, void());
...
};

然后我想在测试用例中使用它:

BOOST_AUTO_TEST_CASE(testSomeMethod) {
    MyClass<MockT> myClassUnderTest;
    MOCK_EXPECT(???)....;
    myClassUnderTest.someMethod();
}

如何对这个对象进行期望?我的第一个想法是在构造函数中将所有创建的 MockT 实例存储在静态容器中,然后在析构函数中将它们从容器中删除。如果对象是用不同于使用它的地方的方法创建的,这将起作用,如下所示:

myClassUnderTest.createTheObject();
MOCK_EXPECT(MockT::findMyObject().doSomething);
myClassUnderTest.useTheObject();

但是为此我需要修改我的类的接口(interface),我真的不想那样做。还有什么我可以做的吗?

最佳答案

如果您不想修改界面或引入额外的间接访问,则可以使用 Typemock Isolator++。

template <typename T>
class MyClass
{
public:
    void someMethod()
    {
        T object;
        object.doSomething();
    }
};

    class RealType  //RealType is the actual production type, no injection needed
    {
    public:
        void doSomething(){}
    };

由于 T 是在 someMethod 内部创建的(在测试方法内部),我们需要伪造 T 的构造函数。 FAKE_ALL 就是这样做的。在 fakeRealType 上设置的行为将应用于在运行时创建的所有 RealType 实例。默认的 FAKE_ALL 行为是递归伪造,这意味着所有伪造的方法都是伪造的,并将返回伪造的对象。您还可以在任何方法上手动设置您想要的任何行为。

TEST_CLASS(MyTests)
    {
    public:

        TEST_METHOD(Faking_Dependency_And_Asserting_It_Was_Called)
        {
            RealType* fakeRealType= FAKE_ALL<RealType>();
            MyClass<RealType> myClassUnderTest;
            myClassUnderTest.someMethod();

            ASSERT_WAS_CALLED(fakeRealType->doSomething()); 
        }

    };

Typemock fakes 并不严格,因此您需要编写适当的断言以确保确实调用了您的方法。您可以使用同样由 Typemock 提供的 ASSERT_WAS_CALLED 来完成。

P.S 我用的是 MSTest。

关于c++ - 如何对在测试对象中创建的模拟对象做出期望?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29198291/

相关文章:

c++ - C 数组的反向迭代器

c++ - 如何从用户输入中获取数据?

c++ - 使用 BOOST.Test 在文件中生成测试报告的更好方法是什么?

c++ - 使用 Boost float 比较获取 bool 返回值

c++ - 我是否正确使用了这个 vector ?

unit-testing - Grails-Spock : while projecting values in query id doesn't exist

java - 运行单元测试时 RmiRegistry 创建多次

c# - 我怎样才能预料到单元测试程序集不可见的类型异常?

c++ - 使用 Boost.Build 和 Boost.Test - 链接器错误

C++,打印输出 (<<) 运算符重载