以前、別の名前でこの質問をしましたが、よく説明できなかったため削除しました。
ファイルを管理するクラスがあるとしましょう。このクラスがファイルを特定のファイル形式を持つものとして扱い、このファイルに対して操作を実行するためのメソッドを含んでいるとしましょう。
class Foo {
std::wstring fileName_;
public:
Foo(const std::wstring& fileName) : fileName_(fileName)
{
//Construct a Foo here.
};
int getChecksum()
{
//Open the file and read some part of it
//Long method to figure out what checksum it is.
//Return the checksum.
}
};
チェックサムを計算するこのクラスの部分を単体テストできるようにしたいとします。ファイルをロードするクラスの部分などを単体テストすることは実用的ではありません。getChecksum()
メソッドのすべての部分をテストするには、40個または50個のファイルを作成する必要があるかもしれないからです。
ここで、クラスの他の場所でチェックサムメソッドを再利用したいとします。メソッドを抽出して、次のようにします。
class Foo {
std::wstring fileName_;
static int calculateChecksum(const std::vector<unsigned char> &fileBytes)
{
//Long method to figure out what checksum it is.
}
public:
Foo(const std::wstring& fileName) : fileName_(fileName)
{
//Construct a Foo here.
};
int getChecksum()
{
//Open the file and read some part of it
return calculateChecksum( something );
}
void modifyThisFileSomehow()
{
//Perform modification
int newChecksum = calculateChecksum( something );
//Apply the newChecksum to the file
}
};
ここで、テストが簡単で複雑なため、このメソッドを単体テストしたいと思います。また、単体テストは単純で非常に難しいため、calculateChecksum()
気にしません。ただし、直接getChecksum()
テストすることはできません。calculateChecksum()
private
誰かがこの問題の解決策を知っていますか?