![](/img/trans.png)
[英]Attempt to convert string variable to bool results in “true” & “false” both equal to 0
[英]Unit test a variable for both true and false
我正在使用googletest / googlemock處理C ++生產代碼。 在使用A.cpp中的一個函數時,我偶然發現了這個想法:
bool A::process_(false);
bool A::process()
{
if ( !process_ ){
process_ = true;
}
return process_;
}
標頭包含的位置:
protected:
static bool process_;
public:
static bool process();
我陷入困境,我只能測試函數的預期輸出為true或輸入為false,如下所示:
TEST(ATest, processVal){
A a;
EXPECT_TRUE(a.process());
}
有沒有辦法測試函數,以便傳遞process_
*true*
和*false*
值? 因此測試涵蓋了兩者的決定。 我正在考慮嘲笑,以便它可以期望調用true和false,但因為它不是類成員中的函數,我想你不能對process_進行模擬? 如果可以,如何模擬變量?
注意:我在linux和gcc :)謝謝!
聲明A
的子類。 由於process_
protected
, A to set it to
在運行測試之前,可以使用A to set it to
的子類A to set it to
true or
false。
protected
屬性/方法,而無需修改生產代碼 即使受到保護,您也可以輕松修改_process
,只需執行以下操作:
class SubA : public A
{
public:
void setProcess( bool val ) { process_ = val; }
};
A a;
SubA* pA = (SubA*) &a;
pA->setProcess( false );
這將很好地工作,是安全的。 即使你將A*
轉換為不是真正有效的SubA*
,它也會起作用,因為內存中的SubA
對象與A
對象相同(因為SubA
沒有聲明任何額外的屬性)。
這只能起作用,因為process_
protected
,所以你創建一個派生類SubA
並使用它,因為編譯器將允許這個子類訪問受保護的東西。
protected
甚至private
屬性/方法,而無需修改生產代碼 現在,如果process_
是private
,這將不起作用......但是, private
/ protected
僅由編譯器管理......屬性在內存中,即使您不被“允許”,也可以訪問它們。
這很難看,但完美無缺:
#define protected public
#define private public
#include "A.h"
#undef private
#undef protected
{
A a;
a._process = false;
}
這種破解使您可以輕松訪問測試程序中的任何private
/ protected
屬性/功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.