【发布时间】:2016-07-28 10:37:59
【问题描述】:
在下面的示例中,我想对class A 进行单元测试,以验证当A::request 被调用时,B::response() 也被调用:
class A
{
public:
void request()
{
m_b.response();
}
private:
B m_b;
};
class B
{
public:
void response();
};
为了做到这一点,class B 必须被嘲笑:
class MockB : public B
{
public:
MOCK_METHOD0( response, void());
};
这样测试将包含:
class TestA : public A
{
...
};
...
EXPECT_CALL( m_b, response( ) ).Times( 1 );
request( );
...
问题是:如何“注入”MockB 来替代B m_b?
第一技术:
创建一个ShadowB 类,将方法调用重定向到class MockB。这要求原始代码位于外部二进制文件中,但不需要对实际代码进行任何更改。
第二个技巧:
- 制作
B::responsevirtual - 将
B m_b更改为std::unique_ptr<B> m_b - 在测试设置期间将
m_b值替换为class MockB的实例
第二种方法意味着更多的代码更改,我不确定它的优点。
【问题讨论】:
标签: c++ unit-testing testing googletest googlemock