我在我的项目中使用gtest/gmock-1.12.1。
我需要在调用模拟方法时进行断言,如下所示:
#include <gmock/gmock.h>
#include <gtest/gtest.h>
using namespace std::placeholders;
using namespace std;
using namespace testing;
struct MyMock_t {
MOCK_METHOD( bool, isEven, ( int ), ( const ) );
MOCK_METHOD( void, isNeg, ( int ), ( const ) );
};
int main() {
MyMock_t moc;
EXPECT_CALL( moc, isEven( _ ) ).WillRepeatedly( Invoke( []( int i_ )->bool{
ASSERT_GT( i_, 0 ); // this line can NOT be compiled.
return i_ % 2 == 0;
} ) );
EXPECT_CALL( moc, isNeg( _ ) ).WillRepeatedly( Invoke( []( int i_ ) {
ASSERT_LT( i_, 0 ); // this line is OK.
} ) );
moc.isEven( -3 );
moc.isNeg( -3 );
};
如果我传递给
EXPECT_CALL
的lambad有返回类型,我可以不在其中执行ASSERT
。
在我的真实项目代码(不是这个例子)中将它们从 lambda 移出太麻烦了,因为需要完成太多断言,并且
EXPECT_CALL
在子线程中触发而不是测试主线程(我必须解决线程同步问题)。
如何让他们留在
EXPECT_CALL
的lambda中?
编译错误:
在 lambda 函数中:
LambdaAssert.cpp:18:9:错误:无效值没有被忽略,因为它应该是
18 | ASSERT_GT( i_, 0 );
要么在另一个 lambda 中调用它
[]{ ASSERT_GT( i_, 0 ); }();
或者有条件地不通过测试
if ( i_ <= 0 ) FAIL() << "Message";