GMOCK - неинтересный вызов функции для любого теста, который не является первым тестом для объекта-указателя с общим указателем - PullRequest
0 голосов
/ 01 декабря 2018

Я столкнулся с проблемой, когда я вызываю один и тот же вызов функции для объекта 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){
    ...
    }
}

Я действительно очень запутался, потому чтоон распознает, какой объект передается в него в первый раз.Я могу на самом деле изменить порядок тестов, и он всегда будет проходить первый тест, а остальные не пройдут.Может кто-нибудь предложить какое-либо понимание того, как я могу обойти эту проблему?Заранее благодарю за терпение.

1 Ответ

0 голосов
/ 01 декабря 2018

Хорошо, я отвечаю на свой собственный вопрос, потому что я только что понял это, и если кто-то еще сможет извлечь из него пользу, то я надеюсь, что они смогут воспользоваться моей глупостью.

По сути, я ПРИНЯЛ что мой f.setPaymentData (тип AccountType) устанавливал данные для перечисления типа учетной записи.Я сделал это, потому что первый тест проходит !(Это потому, что у реальных данных гораздо больше полей, и я их просмотрел).Но, как оказалось, я не был!Я не уверен, почему первый вызов Google Mock ожидающий прошел, но после того, как я установил данные, остальные из них тоже начали проходить.Надеюсь, это поможет.

(я также не уверен, почему за него проголосовали, если я делаю что-то не так, я всегда буду благодарен за понимание того, как я могу сделать лучше, ура)

...