पर अद्वितीय_ptr के साथ निर्भरता इंजेक्शन मेरे पास कक्षा बार का उपयोग करने वाला क्लास फू है। बार (एक संदर्भ नहीं है, क्योंकि मैं फू के बाहर बार जरूरत नहीं है) केवल फू में प्रयोग किया जाता है और फू प्रबंध बार है, इसलिए मैं unique_ptr का उपयोग करें:नकली
using namespace std;
struct IBar {
virtual ~IBar() = default;
virtual void DoSth() = 0;
};
struct Bar : public IBar {
void DoSth() override { cout <<"Bar is doing sth" << endl;};
};
struct Foo {
Foo(unique_ptr<IBar> bar) : bar_(std::move(bar)) {}
void DoIt() {
bar_->DoSth();
}
private:
unique_ptr<IBar> bar_;
};
अब तक तो अच्छा, यह ठीक काम करता है।
namespace {
struct BarMock : public IBar {
MOCK_METHOD0(DoSth, void());
};
}
struct FooTest : public Test {
FooTest() : barMock{ make_unique<BarMock>() }, out(std::move(barMock)) {}
unique_ptr<BarMock> barMock;
Foo out;
};
TEST_F(FooTest, shouldDoItWhenDoSth) {
EXPECT_CALL(*barMock, DoSth());
out.DoIt();
}
परीक्षण में विफल रहता है क्योंकि नकली वस्तु फू के लिए स्थानांतरित किया गया था, और एक उम्मीद की स्थापना पर इस तरह के नकली विफल रहता है: हालांकि, मैं एक समस्या है जब मैं इकाई परीक्षण करने के लिए कोड चाहते हैं।
डि के संभावित विकल्प:
- shared_ptr द्वारा: एक विकल्प (नहीं है: इस मामले में बहुत ज्यादा (बार वस्तु फू के बीच किसी और किसी भी कुछ भी साझा नहीं है)
- Ibar के संदर्भ द्वारा है बार को फू के बाहर संग्रहीत नहीं किया जाता है, इसलिए बनाए गए बार ऑब्जेक्ट को फू को संदर्भित करने के साथ छोड़ दिया जाएगा)
- अद्वितीय_ptr द्वारा: प्रस्तुत किए गए तरीके से
- मूल्य से गुज़रने से परीक्षण योग्य नहीं है: संभव नहीं है (प्रतिलिपि बनाना मौका - unique_ptr के साथ एक ही मुद्दा)।
एकमात्र समाधान मुझे मिल फू से पहले BarMock के लिए कच्चे सूचक की दुकान, केवल BarMock के मालिक बनने के लिए है यानी .:
struct FooTest : public Test {
FooTest() : barMock{new BarMock} {
auto ptr = unique_ptr<BarMock>(barMock);
out.reset(new Foo(std::move(ptr)));
}
BarMock* barMock;
unique_ptr<Foo> out;
};
वहाँ एक क्लीनर समाधान नहीं है? क्या मुझे स्थिर निर्भरता इंजेक्शन (टेम्पलेट्स) का उपयोग करना है? कुछ
की खिन्न) आप पढ़ने में [इस उत्तर] (http://stackoverflow.com/questions/7616475/can-google-mock-a-method-with-a-smart-pointer दिलचस्पी हो सकती है -return प्रकार/11548191 # 11548191)। –
@ πάντα ῥεῖ: लिंक के लिए धन्यवाद। मैंने इसे पहले ही देखा है और यह उन विधियों के लिए काम करता है जो पैरामीटर के रूप में unique_ptr लेते हैं - लेकिन मुझे यकीन नहीं है कि कोई भी रचनाकारों के लिए इस दृष्टिकोण को लागू कर सकता है। – Quarra