Я столкнулся с проблемой, когда я вызываю один и тот же вызов функции для объекта GMOCK в нескольких различных тестах.Ожидаемый вызов всегда одинаков.Однако только первый тест сопоставит ожидаемый вызов с реальным вызовом.Последующие тесты, которые делают тот же ожидаемый вызов, вместо этого потерпят неудачу со следующим сообщением:
Неожиданный вызов фиктивной функции - возвращение значения по умолчанию. Вызов функции: getNewTempAccountSlot (@ 0xaddrs 4-байтовый объект ) Для функции 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){
...
}
}
Я действительно очень запутался, потому чтоон распознает, какой объект передается в него в первый раз.Я могу на самом деле изменить порядок тестов, и он всегда будет проходить первый тест, а остальные не пройдут.Может кто-нибудь предложить какое-либо понимание того, как я могу обойти эту проблему?Заранее благодарю за терпение.