C-строка никогда не будет вызываться в gmock - PullRequest
0 голосов
/ 11 июня 2019

У меня есть функция C ++ для тестирования, и внутри этой функции C ++ она будет вызывать функцию C. Я хотел бы издеваться над этой функцией C с помощью Gmock. Подпись функции C:

int functionA(const char key[3],char value[6]);

int - это код возврата, и ввод key, вывод value. Я хочу смоделировать возвращаемое значение и установить второй аргумент.

Функция C ++, которую я хотел бы проверить:

int functionB{
     ....
     int rcode = functionA(key, value);
     .......
}

Мой "mock.h" это:

#include<functionA.h>
#include <gmock/gmock.h>
class function_A_interface {
public:
   virtual int functionA(const char key[3],char value[6]) = 0;
};

class function_A_mock : public function_A_interface {
public:
   MOCK_METHOD2(functionA, int(const char[3], char[6]));
}

Мой "mock.cc" это:

#include <function_A_mock.h>
extern function_A_mock MockObj;
int function_A(const char key[3],char value[6])
{
    return MockObj.functionA(key, value);
}

Мой "test.t.cpp" это:

TEST(Test, tes){

function_A_mock MockObj;
 pa[3] = {0};
 pb[6] = {1};
 EXPECT_CALL(MockObj, functionA(pa, pb)).WillOnce(DoAll(SetArgPointee<1>(*set), Return(3)));

  functionB(parameter1, parameter2); // it will convert these two paramters to according input in functionA
}

но это показывает мне:

Unexpected mock function call - returning default value.
    Function call: functionA(ffbfc5b0 pointing to "abc      E", ffbfc570 pointing to "")
          Returns: 0
Google Mock tried the following 1 expectation, but it didn't match:

test.t.cpp:121: EXPECT_CALL(MockObj, functionA(pa, pb))...
  Expected arg #0: is equal to ffbfd380 pointing to "abc      E"
           Actual: ffbfc5b0 pointing to "abc      E"
  Expected arg #1: is equal to ffbfd340 pointing to ""
           Actual: ffbfc570 pointing to ""
         Expected: to be called once
           Actual: never called - unsatisfied and active

Кажется, я никогда не смогу сопоставить параметры, которые я установил, поэтому он никогда не будет вызван. Как смоделировать строку C для совпадения и установки цели аргумента в моем случае? Спасибо.

1 Ответ

0 голосов
/ 11 июня 2019

Если вы не предоставляете никаких других Matcher для макетирования аргументов функции, принимается Eq(). Eq() matcher очень прост - он сравнивает полученный аргумент с ожидаемым аргументом, используя operator ==. Но для строк в стиле C это сравнение сравнивает указатели , а не фактические строки.

Для сравнения вы должны использовать StrEq matcher:

using ::testing::StrEq;
EXPECT_CALL(MockObj, functionA(StrEq(pa), StrEq(pb)))
       .WillOnce(DoAll(SetArgPointee<1>(*set), Return(3)));

Однако StrEq() будет сравнивать вещи как строки с нулевым символом в конце. Если вы хотите сравнить целые массивы, используйте ElementsAreArray(array, count):

EXPECT_CALL(MockObj, functionA(ElementsAreArray(pa, 3), ElementsAreArray(pb, 6)))
       .WillOnce(DoAll(SetArgPointee<1>(*set), Return(3)));
...