你可以改變B類爲模板:
template< typename T >
class B
{
public:
static int Method2(int a, int b){ return T::Method1(a,b);}
};
,然後創建一個模擬:
struct MockA
{
static MockCalc *mock;
static int Method2(int a, int b){ return mock->Method1(a,b);}
};
class MockCalc {
public:
MOCK_METHOD2(Method1, int(int,int));
};
每次測試之前,初始化靜態模擬對象MockA::mock
。
另一種方法是直接調用A::Method1
,在B類中創建一個函子對象(也許是std :: function類型),然後在Method2中調用它。然後,它更簡單,因爲您不需要MockA,因爲您會爲此對象創建對MockCalc :: Method1的回調。事情是這樣的:
class B
{
public:
static std::function< int(int,int) > f;
static int Method2(int a, int b){ return f(a,b);}
};
class MockCalc {
public:
MOCK_METHOD2(Method1, int(int,int));
};
,並對其進行初始化:
MockCalc mock;
B::f = [&mock](int a,int b){return mock.Method1(a,b);};
我不熟悉gmock,但不能你只是鏈接'B.o'和'mockA.o'? – Beta
據我所知,處理靜態方法有一些不同的方法。 我可以解決這個問題,將Method1設置爲虛擬的,並在類B中添加構造函數,因此它看起來像B(A和a):a_in_class_b(a){},然後調用Method1將如下所示:a_in_class_b - >方法1(); 但我想看看是否有其他方法。 – Jonhtra