Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ MockRepository的多个共存实例是否可能?如果是,在哪些条件下?_C++_Unit Testing_Hippomocks - Fatal编程技术网

C++ MockRepository的多个共存实例是否可能?如果是,在哪些条件下?

C++ MockRepository的多个共存实例是否可能?如果是,在哪些条件下?,c++,unit-testing,hippomocks,C++,Unit Testing,Hippomocks,Hippomocks的MockRepository就编译器而言支持多个实例。不过,有些用例是不可能的,因为它们会导致单元测试可执行文件崩溃。让我们考虑下面的例子。 void MyCall() { } void MyCall2() { } void MySubTest() { MockRepository mockRep2; mockRep2.ExpectCallFunc(MyCall2); MyCall2(); } void MyTest() { Mock

Hippomocks的
MockRepository
就编译器而言支持多个实例。不过,有些用例是不可能的,因为它们会导致单元测试可执行文件崩溃。让我们考虑下面的例子。

void MyCall()
{
}

void MyCall2()
{
}

void MySubTest()
{
    MockRepository mockRep2;
    mockRep2.ExpectCallFunc(MyCall2);

    MyCall2();
}

void MyTest()
{
    MockRepository mockRep1;
    mockRep1.ExpectCallFunc(MyCall);

    MySubTest();

    MyCall();
}

此示例将(VisualC++ 2010)引入未处理异常(访问违例读取位置0x000)。

  • 分析Hippomocks头显示,这个用例似乎无法预见(参见
    MockReposeInstanceHolder
    )。为什么只允许一个实例
  • 我可以理解,例如,
    MockRepository
    中不同的
    ExpectCallFunc
    实例可能会相互矛盾。这是背后的原因吗
  • 我们可以通过在调用
    MySubTest()
    之后将
    mockRep1
    实例化移动到来解决示例中的问题,但是我们一开始很难理解这个问题。是否有编译时或运行时的可能性来明确标识这样的多个实例

根本问题在于(编译时生成的)函数没有一个地方可以用某个模拟存储库对其进行“标记”,并且与模拟对象不同,它无法生长以携带它。这就是持有者的目的——从生成的存根函数中查找模拟存储库


如果有一个很好的用例,通过使函数中生成的代码更复杂一点,这听起来像是一个可以解决的问题。我必须承认,我看不到直接的即时优势,特别是在两个单独的repo中模拟同一个函数两次无论如何都不会起作用(因为您很难覆盖同一个函数),而且如果在某个时候将它们混合在一起,将导致调试问题非常困难。我不认为增加的复杂性和调试困难与增加的功能相比。

我遇到了同样的问题。 使用cppunit作为测试框架,我使MockRepository成为测试框架类的成员。 如果有多个测试用例,cppunit将为每个测试用例实例化测试框架类的一个新对象。这将覆盖MockRepositoryHolder。我在第一个测试用例中尝试模拟Windows API函数时遇到了异常,但是HippoMocks引用了最后编写的MockRepository,如果最后一个测试用例中的一个。
对我来说,一种解决方法是将MockRepository设置为每个测试用例的本地,或者只为模拟静态函数添加一个新的本地MockRepository

谢谢你的回答。我把它标记为正确答案,因为我是在询问背景信息,而不是“bug”修复(这是一个设计决策,而不是bug)。