我想测试一个管理一组某种实体的类( Controller )。实体是在这个类的内部创建的,因为工厂在这里是一个过度杀手,所以这里是我如何注入模拟:
class TestController : public Controller {
public:
/* Mechanism for a mock injection */
std::shared_ptr<IEntity> create_entity() override {
return temp_entity;
}
/* Variable to hold the entity being injected */
std::shared_ptr<IEntity> temp_entity;
};
生产代码在 Controller 类中调用 create_entity() ,我在此处重载,并将结果添加到容器中。 temp_entity 是我提供模拟和测试的方式,我提供了两个不同的模拟实例,如下所示:
class MockEntity : public IEntity {
MOCK_METHOD0(perform_operation, bool());
}
TEST(ControllerTest, TestFailure) {
std::shared_ptr<TestController> controller = std::make_shared<TestController>();
std::shared_ptr<MockEntity> entity1 = std::make_shared<MockEntity>();
controller->temp_entity = entity1;
controller->add_entity(); // This invokation fetches the result of create_entity()
std::shared_ptr<MockEntity> entity2 = std::make_shared<MockEntity>();
controller->temp_entity = entity2;
controller->add_entity(); // This invokation fetches the result of create_entity()
EXPECT_CALL(*entity1, perform_operation().WillOnce(::testing::Return(true));
EXPECT_CALL(*entity2, perform_operation().WillOnce(::testing::Return(false));
controller->run();
}
controller.run() 仅在每个实体上同时执行 perform_operation() 。
当运行测试时,第二次期望中的函数被调用两次,并且第一次期望中的函数根本不运行。我确信在 执行run() 功能之前,控制器可以在两个不同版本的实体上运行。
我正在尝试做什么是根本问题?如何在测试中分离我对这两个模拟的期望?我尝试在模拟体中实现 perform_operation() 方法创建两个不同的模拟类,并且在调试器中运行测试时,我仍然按两次模拟类的方法
答案 0 :(得分:0)
测试看起来正确,以及如何将模拟注入被测系统,这是一种绝对合理的方法。
我想,关键问题出在你的班级测试中。我用以下控制器重建你的测试:
class Controller {
public:
virtual std::shared_ptr<IEntity> create_entity() = 0;
void add_entity() {
auto entity = create_entity();
entities.push_back(entity);
}
void run() {
for(auto e : entities) {
bool i = e->perform_operation();
}
}
std::vector<std::shared_ptr<IEntity> > entities;
};
通过这个课程,测试成功如预期。