2016-03-08 225 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); 

} 

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