2016-03-08 223 views
0

我正在使用Gmock進行測試。我有一個類,其中所有的方法都是靜態的。 例如靜態方法的Gmock

class A 
{ 
    static int Method1(int x,int y){return (x+y)}; 
}; 

如何使用Gmock測試此類。 請幫我一把。 謝謝

+0

我想你問如何嘲笑方法嗎?不測試這個類,因爲在你的例子中這將是微不足道的 – Martin

+0

就像這樣。 B類 { 空隙XYZ {A ::方法1(X,Y)} } 這是case.How我是否GTEST類B. 我知道我必須模擬類A.But而不進行任何源代碼中的更改。如何測試B? – Viky

+0

如果不進行修改,則在測試B類時不能模擬Method1。給定您的示例時,要給出具體的建議有點困難,因爲對Method1的調用是毫無意義的。如果您只想驗證調用是否正確完成,可以在B的構造函數中注入靜態方法,並在測試時傳遞一個模擬函數。 – Martin

回答

0

你不能不修改你的代碼。但是你可以將你的應用程序與存根對象連接起來。只需創建另一個「A類」實現並將其與您的測試應用程序鏈接起來。

0

您可以通過創建獨立模擬類來實現這一點,該模擬類將不會從您需要模擬的類派生。以下是你將如何做到這一點。

步驟 - 1:評論的具有類的靜態功能

// Comment the class 
/* 
    class A 
    { 
     static int Method1(int x,int y){return (x+y)}; 
    }; 
*/ 

步驟 - 2:創建具有相同名稱爲A一個模擬類和模擬在它的Method1。請注意,它不是從原來的類派生

class A { 
public: 
    MOCK_METHOD2(Method1, int(int x, int y)); 
}; 

讓我們假設這是使用需要被嘲笑它UsingA靜態函數的類。這是如何寫出來的。

class UsingA { 
    A &a1; 
public: 
    UsingA(A & _a1) : a1(_a1) {} 
    int CallFn() { 
     // Original function that needs to be commented 
     // return a1::Method1(10,25); 
     return a1.Method1(10, 20); 
    } 
}; 

那麼這裏就是你怎麼會寫測試

TEST(MyMockTest, Method1Test) { 
    A mstat; 
    UsingA ua(mstat); 

    EXPECT_CALL(mstat, Method1(_,_)) 
    .Times(1) 
    .WillOnce(Return(100)); 

    int retVal = ua.CallFn(); 

    EXPECT_EQ(retVal,100); 

} 

可能不是最好的方式,但服務器旨意。希望它有幫助