GoogleMock SaveArg 用于保存数组?编译器抛出错误,我还没有看到一个好的解决方案

GoogleMock SaveArg for saving array? Compiler throwing errors, and I don't see a good solution yet

本文关键字:解决方案 一个 还没有 数组 保存 用于 SaveArg 编译器 错误 出错 GoogleMock      更新时间:2023-10-16

首先,我已经在相关的谷歌群组上发了一篇文章,但我不确定它有多活跃。无论如何,这是我的问题:

假设我有一个具有成员 Beta 的 Alpha 类。(具体来说,在构造时注入了指向 Beta 的指针(;Beta 是稍后会模拟的对象。但我们关心的是,确切地说,当 Alpha 从 beta 调用函数时,它会调用什么。

class Gamma{
private:
    char array[15];
public:
    char* getArray() { return &array[0]; }
}
class Alpha{
private:
    Beta* m_beta;
public:
    Alpha(Beta* external) : m_beta(external) {}
    DoStuff(const Gamma& thing){
        // ... maybe do some stuff with Gamma;
        Beta->Function(thing.getArray(), 15);
    }
};
class Beta{
public:
    virtual void Function(const char* array, int sizeOfArray);
};
class MockBeta : public Beta{
    MOCK_METHOD2(Function, void(const char*, int));
}
using ::testing::_;
Test(AlphaTest, DoStuffTest){
    char expectedArray[15] = {/*whatever*/};
    char actualArray[15];
//    char* arrayPtr = nullptr;
    MockBeta mock_external;
    Alpha testObject(&mock_external);
    EXPECT_CALL(mock_external, Function(_,_))
      .WillOnce(SaveArg<0>(&(&actualArray[0]));
//      .WillOnce(SaveArg<0>(&arrayPtr));
}

此示例在编译时抱怨:无法获取类型为"char *"的右值的地址(在行上:.WillOnce(SaveArg<0>(&(&actualArray[0]((;

我尝试了多种方法。

  • 带有参数的自定义操作:ACTION_P(SaveToPtr, ptr( { ptr = arg0; } 不起作用,因为 ptr 是自定义操作的常量值。
  • 我可以尝试只使用通用字符*而不是数组。但随后它给出了一个编译器错误,它与类型"const char *const"不兼容

可能还有其他东西。

你知道

,在发布问题时,我想我找到了自己的答案。密钥位于DoStuff(const Gamma& thing)签名中。如果伽玛是常量,那么该函数实际上不能// ... maybe do some stuff with Gamma。但是,如果Gamma不是常量,那么,如果我们假设Gamma是单元测试的,那么我们调用它的任何非常量函数都应该已经过测试,并且在这种情况下我们知道Gamma::getArray((的结果会是什么。

相关文章: