GMOCK 无趣函数调用,用于不是对共享指针模拟对象的第一个测试的任何测试



我遇到一个问题,我在多个不同的测试中对GMOCK对象调用相同的函数。期望调用总是相同的。但是,只有第一个测试会将预期调用与实际调用相匹配。进行相同期望调用的后续测试将失败,并显示以下消息:

意外的mock函数调用-返回默认值 函数调用:getNewTempAccountSlot(@0xaddrs 4-byte object<XX-XX-XXX>( mock函数没有默认操作集,其返回类型也没有默认默认值集

所以,这里有一个代码示例来说明发生了什么,这是我如何设置我的固定装置的。

struct fixture
{
Payment *MOCK_payment;
NiceMock<GMOCK_AccountDatabase_I*> *MOCK_accountDatabase = new NiceMock<GMOCK_AccountDatabase_I()>;
std::shared_ptr<GMOCK_AccountDatabase_I> MOCK_accountDatabaseSharedPtr = std::shared_ptr<NiceMock<GMOCK_AccountDatabase_I>>(MOCK_accountDatabase);
std::shared_ptr<GMOCK_ClientAccount_I> MOCK_clientAccount;
TransactionProcessor testTransactionProcessor;
Fixture()
: testTransactionProcessor(MOCK_accountDatabaseSharedPtr),
MOCK_clientAccount(std::make_shared<GMOCK_ClientAccount_I>())
{
MOCK_payment = new Payment();
}
~Fixture()
{
delete MOCK_payment;
MOCK_payment = 0;
Mock::VerifyAndClearExpectations(MOCK_clientAccount.get());
}
setPaymentData(ClientAccountType acc_type)
{
MOCK_payment->paymentData.account_type = acc_type;
}
}

以下是我如何评估我的测试

TEST(TransactionProcessorTest, New_Automatic_Payment)
{
Fixture f;
f.setPaymentData(AccountTypes::ACC_DEFAULT);
InSequence s1;
EXPECT_CALL(*f.MOCK_accountDatabase, getNewTempAccountSlot(AccountTypes::ACC_DEFAULT)).WillOnce(Return(f.MOCK_clientAccount);
f.testTransactionProcessor.processPayment(*f.payment);
}

TEST(TransactionProcessorTest, New_Manual_Payment)
{
Fixture f;
f.setPaymentData(AccountTypes::ACC_DEFAULT);
InSequence s1;
EXPECT_CALL(*f.MOCK_accountDatabase, getNewTempAccountSlot(AccountTypes::ACC_DEFAULT)).WillOnce(Return(f.MOCK_clientAccount);
f.testTransactionProcessor.processPayment(*f.payment);
}

最后,这里是源代码:

void AccountDatabase::processPayment(AccountTypes type)
{
std::shared_ptr<ClientAccount_I> temp_client_account = nullptr;
temp_client_account = AccountDatabasePtr->getNewTempAccountSlot(type);
if(temp_client_account != nullptr){
...
}
}

我真的很困惑,因为它第一次就能识别出传递给它的对象是什么。实际上,我可以重新排序测试,它总是在第一次测试中通过,而在其他测试中失败。有人能提供我如何绕过这个问题的见解吗?提前感谢您的耐心。

好吧,我在回答我自己的问题,因为我刚刚弄清楚了,如果其他人能从中吸取教训,我希望他们能利用我的愚蠢。

基本上,我假设我的f.setPaymentData(AccountType类型(正在为帐户类型枚举设置数据。我这么做是因为第一次测试通过了!(这也是因为真实数据有更多的字段,我仔细查看了它(。但事实证明,我不是!我不知道为什么第一个谷歌模拟期望调用通过了,但在我设置数据后,其他调用也开始通过。我希望这能有所帮助。

(我也不知道为什么它被否决了,如果我做错了什么,我会一直感激我如何做得更好,欢呼(

最新更新