2011-05-07 67 views
4

让我们有这样的例子:如何谷歌模拟一个从结构调用方法

Class A{ 
     public: 
      int Get(); 
    } 

在另一个文件中:

A a; 
struct B{ 
    int res = a.Get(); 
} 

我需要谷歌模拟获取方法,但是,我也将需要打电话给真正的人。我试过用#ifdef,它似乎工作。然后我决定在#ifdef部分嘲笑它,但它什么都不做。

#ifdef UNIT_TEST 
MOCK_METHOD0(A,Get); 
#else 
int A::Get(){....} 
#endif 

我在做什么错?有没有更干净的方法来做到这一点?请任何帮助,将不胜感激。

+0

你已经发布的代码是不是C++。 – 2011-05-07 14:25:20

+0

http://stackoverflow.com/questions/5921238/how-to-google-mock-a-method-called-from-a-struct的几乎确切欺骗发表相同的用户。 – 2011-05-07 14:26:22

+0

@unapersson关当然,这是C++ – 2011-05-07 16:17:16

回答

-1

头文件

class A{ 
    public: 
     int Get(); 
}; 
A a; 

源文件:

int A::Get(){ 
    .... 
} 

struct B{ 
    return res = a.Get(); 
}; 
+0

这就是现在的样子。尽管我无法改变很多代码 – Manolete 2011-05-09 08:37:15

2

你们这样做是错误的。这是怎么了应该做的事:

1)头文件:

struct A 
    { 
    #ifdef UNIT_TEST 
     MOCK_METHOD0(Get, int()); 
    #else 
     int Get(); 
    #endif 
    }; 

2)源文件:

#ifndef UNIT_TEST 
int A::Get() 
{ 
    // ... 
} 
#endif 
+0

当然,它是C++,我只是简单。 @VJo INT的get(){}已经因为它使用许多其他结构(FSM)的结构之外定义的,所以我不能在结构中重新定义它... – Manolete 2011-05-07 17:00:50

+0

很抱歉的拼写错误的单词,但这些想法是为了显示C++代码。 – Manolete 2011-05-07 17:06:01

+0

@Manuel好的,修正了这个例子 – 2011-05-08 07:41:02

1

Google Mock似乎已经发生了很大的变化。现在您可以尝试在食谱中描述的delegating to a real object。你可以继续设置和检查你的模拟预期,但电话也将由真实的事情来处理。

class MockA : public A 
{ 
public: 
    MockA() 
    { 
     ON_CALL(*this, Get()).WillByDefault(Invoke(&real, &A::Get)); 
    } 
    MOCK_METHOD0(Get, int()); 

private: 
    A real; 
}; 
相关问题