我有一些基於googlemock框架的單元測試的遺留代碼。當我試圖單元測試一些新的情況下延長我遇到了以下問題:使用googlemock與假虛擬impls的非虛函數
class D
{
public:
void pubMethod1();
int pubMethod2();
// There are pretty much non-virtual methods, both public and private
...
protected:
uint method3();
void method4();
...
// Some class members are here
};
class SUT
{
public:
...
protected:
D _dep;
};
的SUT類(測試軟件)應進行測試,其執行文件sut.cpp
定義。 SUT依賴於D類,其實現在文件d.cpp
中。爲了減少鏈接器依賴關係,我不想在測試中添加d.cpp
,所以當鏈接測試時,D的成員有很多'未定義符號'錯誤。爲了消除錯誤並提供可預測的行爲,我將在測試中爲D的方法創建假實現。但是,直到D的方法是虛擬的,我仍然無法使用它的所有googlemock的功能。
我喜歡從googlemock框架中使用WillOnce,AtLeast,WillRepeatedly,Invoke等功能的想法,因爲它使單元測試的創建變得更容易。問題是我不喜歡改變D的界面,把它的方法變成虛擬界面。是否有可能使用googlemock函數與假實現我要爲D的方法創建?
注意:我已經考慮過使用模板化SUT類的解決方案,但是我想知道是否存在其他解決方案。
談到通過一個抽象的注入d接口。我認爲我有某種恐懼症,但似乎有一個抽象界面與唯一的派生類似乎很奇怪。另一方面,我明白這種方法在單元測試中的優點。所以我不能決定使用這種方法)) – Rom098
用這種方式來思考這個問題:代碼應該具有實現的功能 - >唯一的證明功能在於它被測試 - >可測試性很重要 - >應以可測試的方式設計實施。因此,添加一些「只是爲了測試」是沒有錯的... – PiotrNycz
聽起來不錯))我接受了你的答案,既好的建議和技巧。 – Rom098