GMOCK Uninteresting Function 调用任何不是对共享指针模拟对象的第一个测试的测试
GMOCK Uninteresting Function call for any test that isn't the first test on a shared pointer mock object
我 运行 遇到了一个问题,我在多个不同的测试中对 GMOCK 对象调用相同的函数调用。期望调用总是相同的。但是,只有第一个测试会将预期调用与真实调用相匹配。进行相同 expect 调用的后续测试将失败并显示以下消息:
意外的模拟函数调用 - returning 默认值。
函数调用:getNewTempAccountSlot(@0xaddrs 4 字节对象 < XX-XX-XX-XX >)
mock 函数没有设置默认操作,其 return 类型没有设置默认默认值。
所以,这是一个代码示例,说明发生了什么,这是我设置夹具的方式。
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 类型)正在为帐户类型枚举设置数据。我这样做是因为第一次测试 通过 ! (那是因为真实数据有更多字段,我仔细查看了它)。但事实证明,我不是!我不确定为什么第一个 google 模拟 expect 调用通过了,但在我设置数据后,其余的也开始通过。我希望这有帮助。
(我也不确定为什么它被否决了,如果我做错了什么,我将永远感激我如何做得更好,干杯)
我 运行 遇到了一个问题,我在多个不同的测试中对 GMOCK 对象调用相同的函数调用。期望调用总是相同的。但是,只有第一个测试会将预期调用与真实调用相匹配。进行相同 expect 调用的后续测试将失败并显示以下消息:
意外的模拟函数调用 - returning 默认值。 函数调用:getNewTempAccountSlot(@0xaddrs 4 字节对象 < XX-XX-XX-XX >) mock 函数没有设置默认操作,其 return 类型没有设置默认默认值。
所以,这是一个代码示例,说明发生了什么,这是我设置夹具的方式。
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 类型)正在为帐户类型枚举设置数据。我这样做是因为第一次测试 通过 ! (那是因为真实数据有更多字段,我仔细查看了它)。但事实证明,我不是!我不确定为什么第一个 google 模拟 expect 调用通过了,但在我设置数据后,其余的也开始通过。我希望这有帮助。
(我也不确定为什么它被否决了,如果我做错了什么,我将永远感激我如何做得更好,干杯)