在CppUtest中是否有一种方法可以在运行时在同一个测试文件中调用mock和real函数?

时间:2016-10-17 09:09:02

标签: cpputest

例如:

Production.cpp

int func1()
{
    return 7;        
}

void func2()
{
    printf("func2");
}

void productionCode()
{
    int x = func1();

    if(x==7) func2(); 
}

TestProduction.cpp

int func1()
{
    return mock().actualCall("func1").
        returnIntValue();
}

void setExpFunc1(int x)
{
    mock().expectOneCall("func1")
        andReturnValue(x);
}

TEST(testGroupSample, testMockFunc1)
{
    setExpFunc1(8);
    // this will call mock func1()
    productionCode();
}

TEST(testGroupSample, testRealFunc2)
{
    // this will call real func1()
    productionCode();
}

根据我的理解,当func1()被嘲笑时,没有办法测试实际的功能。

下面的示例代码只是我想要做的事情。

因为我必须测试许多调用里面许多函数的函数。 有时,我不关心那些其他函数的实际结果,所以我嘲笑它,但是当我想在我测试的函数内部调用时测试实函数的行为,我不能做因为那个功能已经被嘲笑了。

此外,我希望我可以在不修改生产代码的情况下完成此操作,只需要修改测试代码。

2 个答案:

答案 0 :(得分:0)

没有。您使用链接器进行了模拟,因此,对于整个文件上下文,实际函数不存在。

答案 1 :(得分:0)

您可以使用 函数指针 (或std::function,...)来 设置实现 <来实现此目的/ strong> productionCode() 在运行时使用

伪代码

int func1() { /* Production }
int func1_mock() { /* Mock */ }


std::function<int()> impl; // Use a function ptr for C 

void productionCode()
{
    int x = impl(); // Call current implementation
    // ...
}

TEST(...)
{
    impl = func1; // Use production code
    productionCode();

    impl = func1_mock; // Use mock instead
    productionCode();
}