互いに呼び出す関数がたくさんあるとします。それぞれを個別にテストしたいと思います。たとえば、Bar が正しくなくても、実装されていなくても Foo をテストできるはずです。1 つの解決策は、これらの関数を仮想メソッド (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 では、大量の呼び出しを行わない限り、パフォーマンスへの影響は小さいです (そして、時期尚早の最適化について彼らが何を言っているか知っています)。これが保守性、テスト容易性などにどのように影響するかについて、私はもっと興味があります。