A类正在测试中,我希望EXPECT_CALL立即返回,并为模拟的asyncfunc()方法调用值为200(右值引用)的lamda函数。请阅读符合代码的注释

#include "gtest/gtest.h"
#include "gmock/gmock.h"

#include<iostream>
using namespace std;

// Concrete class
class B
{
    public:
       // asyncfunc signature, p2 is function pointer with argument as rvalue referrence
        bool asyncfunc(int p1, std::function<void(int &&v)> &&p2, float p3){
            cout << "asyncfunc() \n" << "param1 : " << p1 << "\nparam 3 : " << p3 << endl;
            p2(100);
        }

};

class MockB
{
    public:
        // asyncfunc mocked
        MOCK_METHOD3(asyncfunc, bool (int, std::function<void(int &&v)> &&, float));
};

// unit under test - A
template< typename T>
class A
{
    T *bobj;
    void sync(){}
    public:
    A(T *pbobj):bobj(pbobj){}
    void test_function()
    {
        bool value = bobj->asyncfunc(10, [this](int &&a){
                    cout << "Lamba : " << a << endl;
                    if(a == 100)
                    {
                      sync();
                    }
                },
                20);
        cout << "test_function : " << value << endl;
    }
};
//我的测试如下所示,出现编译错误
TEST(A, test_function)
{
    MockB b;
    A<MockB> obj(&b);
    using namespace ::testing;

    EXPECT_CALL(b, asyncfunc(_,_,_)).WillOnce(DoAll(InvokeArgument<1>(100),Return(true)));
    obj.test_function();
}

最佳答案

我不确定您的代码段未指定lambda是否返回某些内容-请按照'minimal, reproducible example' principle进行100%的确定,但我认为问题可能在于lambda不返回任何类型(void),并且您的模拟函数asyncfunc返回的非-无效类型(例如bool)。在这种情况下,您需要使用asyncfunc操作指定对Return的调用应返回的内容:

struct MockClass {
    MOCK_METHOD3(asyncfunc, bool(bool, std::function<void(bool)>, int));
};

TEST(MockTest, CallLambda) {
    MockClass m{};

    auto param{false};

    EXPECT_CALL(m, asyncfunc(_, _, _)).WillOnce(DoAll(InvokeArgument<1>(param), Return(false)));

    ASSERT_FALSE(m.asyncfunc(
        true, [](bool) {}, 42)); // ASSERT_FALSE because `Return` action specified `false`
}
在没有DoAllReturn操作的情况下,gmock尝试使用InvokeArgument的结果作为它不能返回的asyncfunc的返回值,因为它无法使用void作为bool

10-06 01:54