C++ MockRepository的多个共存实例是否可能?如果是,在哪些条件下?
Hippomocks的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
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)。