0

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

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)。只允许一个实例的原因是什么?
  • 我可以理解,例如不同ExpectCallFuncMockRepository实例可能会相互矛盾。这是它背后的原因吗?
  • 我们可以通过将mockRep1实例化移到MySubTest()调用之后来解决示例中的问题,但我们很难在一开始就理解这个问题。是否有编译时或运行时的可能性来明确识别这样的多个实例?
4

2 回答 2

0

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

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

于 2014-11-19T12:22:46.117 回答
0

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

于 2014-11-19T14:27:28.043 回答