簡體   English   中英

單元測試true和false的變量

[英]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_ protectedA to set it to在運行測試之前,可以使用A to set it to的子類A to set it to true or false。

  • 解決方案1:從測試訪問任何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並使用它,因為編譯器將允許這個子類訪問受保護的東西。

  • 解決方案2:從測試中訪問任何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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM