gpt4 book ai didi

dependency-injection - 使用依赖注入(inject)模拟 C++ 类

转载 作者:行者123 更新时间:2023-12-04 08:22:26 25 4
gpt4 key购买 nike

假设您正在测试类 A 并且它有一个 dependency injection BC 的依赖注入(inject)。
所以你模拟 B 但它唯一的构造函数需要注入(inject) C,那么你是否也必须模拟 C 并将模拟的 C 注入(inject)模拟的 B 然后才可以将它注入(inject)A
如果你有 5 个连续的依赖项怎么办?

有哪些替代方案?

我使用 Google Mock ,所以一个具体的答案也会有所帮助。

最佳答案

Emile 的想法是正确的,你应该依赖于接口(interface)而不是具体的类。所以在你的例子中它会是这样的:

#include <iostream>
using namespace std;

class C {
public:
int x;
};

class B {
public:
~B(){};
virtual void doSomething() = 0;
};

class ConcreteB : public B{
public:
ConcreteB(C c) : m_c(c) {}
void doSomething(){
std::cout << "HelloWorld" << std::endl;
}
private:
C m_c;
};
class A{
public:
A(B *b): m_b(b){}

void functionToTestWithSideEffect(){
m_b->doSomething();
}
private:
B *m_b;

};

//#include <gmock/gmock.h>

int main() {
C c;
c.x = 42;
ConcreteB b(c);
A a(&b);
a.functionToTestWithSideEffect();
return 0;
}

在您的测试中,您创建了一个不依赖于任何类 C 的模拟 B。然后您仅测试与 B 的接口(interface)。通过这种方式,您打破了 A 对 C 的依赖。创建一个不依赖于任何类 C 的模拟 B C 非常简单:

class MockB : public B {
public:
MOCK_METHOD0(doSomething, void());
};

关于dependency-injection - 使用依赖注入(inject)模拟 C++ 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5726580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com