2012-01-20 17 views
10

मैं सिर्फ इकाई परीक्षण पर काम करना शुरू (परीक्षण के लिए बूस्ट ढांचे का उपयोग कर, लेकिन mocks के लिए मैं गूगल मॉक उपयोग करने के लिए) और मैं इस स्थिति है:गूगल नकली इकाई परीक्षण स्थिर तरीकों C++

class A 
{ 
static int Method1(int a, int b){return a+b;} 
}; 

class B 
{ 
static int Method2(int a, int b){ return A::Method1(a,b);} 
}; 

तो, मैं नकली कक्षा ए बनाने की जरूरत है, और मेरी कक्षा बी को कक्षा से वास्तविक विधि 1 का उपयोग न करने के लिए, लेकिन नकली उपयोग करने की आवश्यकता है।

मुझे यकीन नहीं है कि यह कैसे करें, और मुझे कुछ समान उदाहरण नहीं मिला। हर परीक्षण से पहले

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 प्रारंभ:

+0

मैं gmock से परिचित नहीं हूँ, लेकिन तुम सिर्फ 'B.o' और' mockA.o' लिंक नहीं कर सके? – Beta

+0

जहां तक ​​मुझे पता है, स्थिर तरीकों से निपटने के कुछ अलग तरीके हैं। मैं शायद वर्चुअल होने के लिए विधि 1 बनाने और कक्षा बी में कन्स्ट्रक्टर जोड़ने के साथ इसे हल कर सकता हूं, इसलिए यह बी (ए और ए) जैसे कुछ दिखता है: a_in_class_b (ए) {}, और फिर विधि 1 की कॉल इस तरह दिखेगी: a_in_class_b -> Method1(); लेकिन मैं देखना चाहता हूं कि कोई और तरीका है या नहीं। – Jonhtra

उत्तर

14

आप किसी टेम्प्लेट में वर्ग बी को बदल सकता है:

template< typename T > 
class B 
{ 
public: 
static int Method2(int a, int b){ return T::Method1(a,b);} 
}; 

और उसके बाद एक नकली पैदा करते हैं।

एक और विकल्प सीधे A::Method1 पर कॉल करना है, कक्षा बी में एक फ़ैक्टर ऑब्जेक्ट (शायद std :: function type) बनाएं, और विधि 2 में कॉल करें। फिर, यह आसान है, क्योंकि आपको मोका की आवश्यकता नहीं होगी, क्योंकि आप इस ऑब्जेक्ट में 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);}; 
+1

धन्यवाद, यह वह उत्तर था जिसे मैं ढूंढ रहा था :) – Jonhtra

+0

@ user1160721 बाईं ओर "उत्तर स्वीकार करें" बटन होना चाहिए, अगर यह उत्तर वह है जिसे आप ढूंढ रहे हैं;) –

+0

ओ हाँ, मैं इसे अब देख सकता हूं , मैं इसे क्लिक करूंगा, मैं यहां नया हूं। मैं देख सकता हूं कि प्रत्येक उपयोगकर्ता के लिए कुछ रेटिंग है और यह "स्वीकृति उत्तर" इस ​​रेटिंग को बढ़ाता है :) मेरे पास इससे संबंधित एक और समान प्रश्न है। एक नया पोस्ट करने के लिए, या टिप्पणी में पूछने के लिए? :) – Jonhtra

संबंधित मुद्दे