GMill `WillOnce` с` Return` не ошибается при неправильном возвращаемом значении - PullRequest
1 голос
/ 27 марта 2019
  1. Я создал макет внешнего сокета API в файле my_inet.cpp.
  2. Функции GMock для этого API сокета находятся в mock.h файле.
  3. Я использую созданный сокет API my_inet в файле server.cpp.
  4. Тест написан на gtest.cpp.

Проблема в том, что в my_inet.cpp я возвращаю 1000, а в gtest.cpp я написал .WillOnce( Return( 10 ));, и он НЕ терпит неудачу.

Почему?


gtest.cpp

TEST(HelloTest, HelloReturnsOne)
{
    MockMyTCPAPI obj_myTCP;

    EXPECT_CALL( obj_myTCP, hello())
    .Times( 2 )
    .WillOnce( Return( -100 ))
    .WillOnce( Return( 10 ));

    Server obj_server( &obj_myTCP );

    EXPECT_EQ( obj_server.hi(), -100 );
    EXPECT_EQ( obj_server.hi(), 10 );
}

mock.h

#include "my_inet.h"
#include <gmock/gmock.h>

class MockMyTCPAPI : public MyTCPAPI {
 public:
  MOCK_METHOD0( hello,  int());
  MOCK_METHOD3( socket, int(int arg1, int arg2, int arg3));
  MOCK_METHOD3( bind,   int(int arg1, int arg2, int arg3));
  MOCK_METHOD2( listen, int(int arg1, int arg2));
  MOCK_METHOD3( accept, int(int arg1, int arg2, int arg3));
  MOCK_METHOD2( send,   int(int arg1, int arg4));
};

my_inet.cpp

int MyTCPAPI::hello()
{
    return 1000;
}

server.cpp

int Server::hi()
{
    return myTCPAPI->hello();
}

Выход:

[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from HelloTest
[ RUN      ] HelloTest.HelloReturnsOne
[       OK ] HelloTest.HelloReturnsOne (0 ms)
[----------] 1 test from HelloTest (0 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (0 ms total)
[  PASSED  ] 1 test.

1 Ответ

1 голос
/ 27 марта 2019

В server.cpp, myTCPAPI->hello() вернет -100 и 10, но Server::hi не возвращает их;он всегда возвращает 1.

Не могли бы вы попробовать:

int Server::hi() {
  return myTCPAPI->hello();
}

Обновленный ответ о насмешке

Путем насмешки мы создаем объект, для которого мыможет контролировать (не проверять) свое возвращаемое значение.Например, оператор EXPECT_CALL говорит: «Привет метод obj_myTCP будет вызван дважды. Для первого вызова верните -100; для второго вызова верните 10».В вашем примере первый вызов возвращает -100, второй вызов возвращает 10. Это соответствует ожиданиям.Реализация my_inet.cpp переопределена.

Использование фиктивного объекта заключается в том, чтобы ввести возвращаемое значение, а не проверить его возвращаемое значение.Его польза более очевидна, если вы представите насмешку над объектом времени.В этом случае вы можете контролировать время возврата, а не полагаться на реальные часы.

Для получения дополнительной информации о насмешках, пожалуйста, обратитесь к Каково назначение фиктивных объектов? и Что такое издевательство? .

...