gmock多个模拟实例,但只有一个有效

时间:2018-01-30 20:21:54

标签: c++ unit-testing googletest gmock

我想测试一个管理一组某种实体的类( 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() 方法创建两个不同的模拟类,并且在调试器中运行测试时,我仍然按两次模拟类的方法

1 个答案:

答案 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;
};

通过这个课程,测试成功如预期。