getNumberOfShows, printMsg を他のクラスに展開してモックせずに makeTvSeries() メソッドをテストしたいので、TvChannel クラスをモックしようと思いました。
仮想性を取り除くことなく、子メソッド getNumberOfShows、printMsg を呼び出す基本クラス メソッド (makeTvSeries) を呼び出すことは可能ですか? したがって、たとえば foo.playTvSeries(mockTvChannel) などの他のテストで同じモック クラス定義を使用して、makeTvSeries? の呼び出しを期待できます。
さらに、私がやっていることは良い習慣ですか?プログラム全体には、cin と cout を使用する他のクラスもあり、最初に述べたように、それらすべてを入出力を担当する 1 つのクラスに抽出したくありませんでした。あなたの経験と私は何をすべきか?
class MockTvChannel : public TvChannel{
public:
MOCK_METHOD0(getNumberOfShows, int());
//MOCK_METHOD0(makeTvSeries, void());
MOCK_METHOD0(printMsg, void());
};
TEST(sample_test_case, sample_test)
{
MockTvChannel channel;
EXPECT_CALL(channel, getNumberOfShows())
.Times(1)
.WillOnce(::testing::Return(10));
EXPECT_CALL(channel, printMsg())
.Times(10);
channel.makeTvSeries();
}
class TvChannel
{
protected:
virtual int getNumberOfShows(){
int nShows;
std::cin >> nShows;
return nShows;
}
virtual void printMsg(){
std::cout << "What a show!" << std::endl;
}
public:
/*virtual*/ void makeTvSeries()
{
int nShows = getNumberOfShows();
for(int i = 0; i<nShows; ++i){
printMsg();
}
}
virtual ~TvChannel() {};
};