मैं सी पुस्तकालय के लिए परीक्षण लिखना चाहता हूं, सी में। मैं परीक्षण के लिए कुछ कार्यों को मजाक करना चाहता हूं।सी में फ़ंक्शन मॉकिंग (परीक्षण के लिए) सी?
मान लीजिए मेरे पुस्तकालय निम्नलिखित स्रोत से संकलित किया गया है:
/* foo.h */
int myfunction(int x, int y);
/* foo.c */
#include "foo.h"
static int square(int x) { return x * x; }
int myfunction(int x, int y) {
return square(x) + square(y);
}
मैं इस तरह एक परीक्षण लिखना चाहते हैं:
/* foo_test.c */
#include "foo.h"
static int square(int x) { return x + 1; }
int main(void) {
assert(myfunction(0, 0) == 2);
return 0;
}
वहाँ किसी भी तरह से मैं इतना संकलन कर सकते हैं कि myfunction
का उपयोग करेगा है की foo_test.c
में foo.c
में से एक की बजाय, केवल निष्पादन योग्य foo_test
को लिंक करते समय? यही है, मैं foo.c
को लाइब्रेरी में संकलित करना चाहता हूं (चलिए इसे libfoo.so
पर कॉल करें), और उसके बाद को libfoo.so
और कुछ जादू के साथ संकलित करना चाहते हैं ताकि मुझे निष्पादन योग्य foo_test
मिलेगा जो square
के विभिन्न कार्यान्वयन का उपयोग करता है।
square
को static
घोषित नहीं किया गया है, तो समाधान सुनना उपयोगी होगा, लेकिन उपरोक्त मामले को हल करना बेहतर होगा।
संपादित करें: यह निराशाजनक लगता है, लेकिन यहां एक विचार है: मान लीजिए कि मैं -O0 -g
के साथ संकलित करता हूं, इसलिए यह संभावना नहीं है कि square
इनलाइन हो जाएगा और मेरे पास प्रतीक दिखाना चाहिए कि कॉल कहां हल हो गया था। क्या ऑब्जेक्ट फ़ाइल में घुसने और हल किए गए संदर्भ को बदलने का कोई तरीका है?
'एलडी_PRELOAD' आपको यह दे सकता है, लेकिन मुझे उम्मीद है कि किसी और के पास बेहतर जवाब होगा। – sarnold
स्थिर कार्यों के लिए नहीं – bdonlan
मुझे नहीं लगता कि 'LD_PRELOAD' ऐसा करने जा रहा है। मैं एक लाइब्रेरी के अंदर एक फ़ंक्शन (जो स्थैतिक हो सकता है) को बदलने में सक्षम होना चाहता हूं जो पहले ही संकलित है। जैसा कि मैं समझता हूं (और शायद यह झूठा है), 'foo_test' को जोड़ने का प्रयास करने से पहले' myfunction' के अंदर 'वर्ग' प्रतीक' को हल कर दिया जाएगा। – leif