我需要一种让链接器更喜欢一种实现而不是另一种实现的方法。我的用例如下:我正在编写单元测试,我需要模拟一些对象。问题是那些对象在'main'库中,即使在调试中也无法丢弃,因为许多SDK都存在于那里。
所以我已经实现了那些模拟,但现在看来链接器更喜欢'main'库的实现,至少我的代码没有被调用。我正在使用带有Symbian工具链的ARM RVCT 4 C ++编译器,如果这很重要的话。
非常感谢任何想法(甚至解决方法)!
编辑:我需要模拟静态方法调用,可能它很重要,因为我认为静态方法与普通方法相比在其他方面有所联系。
答案 0 :(得分:1)
通常在链接阶段不进行模拟,但在代码中解决。 Dependency Injection是首选技术之一。也就是说,您应该对代码进行建模,以便在真实和模拟实现之间进行选择。
例如,您想在代码中创建对象A.一种方法是在构建测试时有两个不同的A实现并链接到模拟实现。依赖注入方法建议具有指向接口的指针并从外部(例如,在构造函数中)传递对象本身。然后,从生产代码中,您将传递真实对象,并从单元测试中传递模拟。
如果您绝对需要在链接级别执行此操作并且无法避免链接“真实”对象,那么您可以包装这些对象吗?这是一个例子:
假设这是您要测试的代码:
void my_method()
{
ProblematicClass c;
c.Call();
}
ProblematicClass
在两个地方实现:一个在SDK内,另一个是你的模拟。如果您可以将ProblematicClass
包装在另一个类中,那么您可以创建两个源文件:
生产文件:
struct Wrapper
{
public:
void Call() { m.Call(); }
private:
ProblematicClass m;
}
模拟文件:
struct Wrapper
{
public:
void Call() { m.Call(); }
private:
MockClass m;
}
现在您可以控制源代码,您无需更改已测试代码的设计,也可以排除生产实施。您测试的代码当然必须更改为:
void my_method()
{
Wrapper c;
c.Call();
}
答案 1 :(得分:1)
我不确定我到底知道您的问题是什么,但可能值得查看$sub$$
和$super$$
的文档:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0206j/Chdefdce.html。