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`
}
在没有DoAll
和Return
操作的情况下,gmock尝试使用InvokeArgument
的结果作为它不能返回的asyncfunc
的返回值,因为它无法使用void
作为bool
。