2

私たちのコードでは、多くの共有ライブラリを利用しています。この特定のケースでは、これらのライブラリの 1 つに静的メソッドが実装されています。コード内のさまざまな場所でこのメソッドを呼び出します。ただし、テストする場合は、プロセスを分離したいので、そのメソッドの実装をモックします。

これを行うために考えている方法は、テスト バイナリでメソッドを再実装することです。これにより、ライブラリ内の実装ではなく、実装が確実に採用されます。

ここでの主な質問は次のとおりです。これは純粋な悪ですか? もしそうなら、そのような場合の好ましい解決策は何ですか?

例...

共有ライブラリのヘッダー:

static const bool theMethod(...);

共有ライブラリでのメソッドの実装:

static const bool theMethod(...){
  //The real implemetation does some fancy stuff here
  return theRealValue;
}

私たちのテストケース:

#include <headerOfTheMethod.hpp>

//Our own "mocked" implementation
static const bool theMethod(...){
  return true; //Lets say we always return true for the purpose of our test
}

//Here comes our code testing the class which is using that particular method

補足: gcc をコンパイラとして使用しており、ライブラリは動的にリンクされています。

更新: これが静的メソッドの場合。それは良い出発点ですが、それがクラスのメンバー関数だったらどうなるでしょうか?

4

2 に答える 2

2

One Definition Ruleに違反することになります。リンカーが機能する方法は、あなたのために機能する可能性がありますが、それはギャンブルであり、保証はありません.

于 2012-09-10T15:30:50.230 に答える
2

はい、次の場合に限り安全です。

  1. あなたのメソッドは、外部的にオーバーライドしているものと同じように機能します
  2. リンカー エラーを回避します。コンパイラのドキュメントを確認してください。ただし、シンボルを「弱い」ものにする方法があるはずなので、複数の定義について文句を言うことはありません。これは、システム ライブラリ内の関数をオーバーライドして、テスト目的で呼び出しにフックする標準的な方法です。
于 2012-09-10T16:24:16.343 に答える