如何期望稍后创建的指针参数

how to expect pointer argument which is created later

本文关键字:创建 指针 参数 何期望 期望      更新时间:2023-10-16

我有这样的组 ->元素要添加/删除,用代码snippt:

// production code:
Group::add(Element* e) {...};
Group::remove(Element* e) {...};
ElementDerived::ElementDerived(Group* group){ group->add(this);}
ElementDerived::~ElementDerived(Group* group){ group->remove(this);}

每当我想测试ElementDerived类时,我都必须在设置/拆卸中进行以下操作。但是,如何在没有_的情况下明确设置参数期望?

// test code:
struct Test_ElementDerived : public ::testing::Test {
  void SetUp() override {
    ElementDerived* p = nullptr;
    EXPECT_CALL(group, add(_)) // how to set expection on the pointer argument?
      .WillOnce(Invoke([&p](auto base_ptr) {
        p = static_cast<ElementDerived*>(base_ptr);
      }));
    sut = std::make_unique<ElementDerived>(&group);
  }
  void TearDown() override {
    EXPECT_CALL(group, remove(sut.get()));
  }
  MockGroup group{};
  std::unique_ptr<ElementDerived> sut;
};

您可以做到这一点:

 Element* p = nullptr;
 EXPECT_CALL(group, add(_)).WillOnce(SaveArg<0>(&p));
 sut = std::make_unique<ElementDerived>(&group);
 ASSERT_EQ(p, static_cast<Element*>(sut.get()));

这与您的所作所为没有太大不同。要用一些匹配器替换_-您必须知道指针 - 实现这一目标的唯一方法是使用新的位置:

 struct DestructCaller {
     template <typename T> void operator()(T* ptr)
     {
        if (ptr) ptr->~T();
     }
 };
 std::aligned_storage_t<sizeof(ElementDerived), alignof(ElementDerived)> sut_storage;
 std::unique_ptr<ElementDerived, DestructCaller> sut;
 void SetUp() override
 {
     EXPECT_CALL(group, add((ElementDerived*)&sut_storage));
     sut.reset(new (&sut_storage) ElementDerived(&group));
 }

或类似的概念不受限制地结合:

 union
 {
     ElementDerived sut;
 };
 void SetUp() override
 {
     EXPECT_CALL(group, add(&sut));
     new (&sut) ElementDerived(&group);
 }
 void TearDown() override
 {
     EXPECT_CALL(group, remove(&sut));
     sut.~ElementDerived();
 }

我个人认为 - 与Savearg和assert_eq的一种方式更可读。