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

时间:2014-10-10 11:18:11

标签: c++ unit-testing hippomocks

就编译器而言,Hippomocks'MockRepository支持多个实例。但是,有些用例不可能导致单元测试可执行程序崩溃。让我们考虑以下示例。

void MyCall()
{
}

void MyCall2()
{
}

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

    MyCall2();
}

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

    MySubTest();

    MyCall();
}

此示例引导(在Visual C ++ 2010中)未处理的异常(访问冲突读取位置0x00000048)。

  • 分析Hippomocks标题显示似乎没有预见到这个用例(参见MockRepoInstanceHolder)。仅允许一个实例的原因是什么?
  • 我可以理解,例如ExpectCallFunc个实例中的不同MockRepository可能会发生矛盾。是背后的原因吗?
  • 我们可以通过将mockRep1实例化移到MySubTest()调用之后解决我们示例中的问题,但我们很难首先理解问题。是否存在明确识别此类多个实例的编译时或运行时可能性?

2 个答案:

答案 0 :(得分:0)

根本问题是(编译时生成的)函数没有地方用某个模拟存储库“标记”它,并且与模拟对象不同,它也不能生长为携带它。这就是持有者的目的 - 从生成的存根函数中找到模拟存储库。

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

答案 1 :(得分:0)

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