假设您有一堆相互调用的函数。您想单独测试它们中的每一个。例如,您应该能够在 Bar 不正确甚至没有实现的情况下测试 Foo。一种解决方案是将这些函数转换为虚拟方法(或者如果您不使用 C++,则只是常规方法)。例如
class K {
public:
virtual int Foo();
virtual int Bar(); // called by Foo
// No member variables.
};
现在,您可以在测试中执行此操作:
// You could use googlemock instead of this.
class KFoo : public K {
public:
virtual int Bar() {
return 42;
}
};
// googletest
TEST(K, Foo) {
std::unique_ptr<K> k(new KFoo);
assert(k->Foo() == 7); // Bar gets called, and returns 42.
}
这很奇怪,但有几个原因:
- K 没有成员变量;它是“无国籍”的。
- 你需要
new K
为了调用任何东西。
这是一个好主意吗?这已经有名字了吗?显然,虚拟会减慢速度,但是 IIUC,除非您进行大量调用,否则性能影响很小(而且您知道他们所说的过早优化)。我对这将如何影响可维护性、可测试性等更感兴趣。