Googlemock EXPECT_CALL завершается с ошибкой: нет совпадения с оператором == (типы операндов: const XX) - PullRequest
1 голос
/ 05 июня 2019

Я впервые использую googlemock / test. Ошибка компиляции из-за следующей строки:

EXPECT_CALL(orderWriter, writeOrders(aNonZeroSizeOrder))
    .Times(1);

ОШИБКА:

ошибка: не найдено совпадений для операндов типа operator == const Order и Const Order. 'const Order' не является производным от 'const std :: istream_iterator <_Tp, _CharT, _Traits, _Dist>'

примечание: кандидат: шаблон bool std :: operator == (const std :: set <_Key, _Compare, _Alloc> &, const std :: set <_Key, _Compare, _Alloc> &)

/ usr / lib / gcc / x86_64-pc-cygwin / 7.4.0 / include / c ++ / bits / stl_algobase.h: 800: 22: примечание: «порядок const» не является производным от «const std :: pair» <_T1, _T2> ' if (! (* __ first1 == * __ first2)) ~~~~~~~~~~~ ^ ~~~~~~~~~~~~

Если я это прокомментирую, компиляция прошла успешно. Я делаю что-то не так при определении метода Mock с параметром const ref?


class Order
{
    //represents an order
};

class OrderWriter
{
public:
    virtual void writeOrders(const std::vector<Order>& allOrders)
    {
        // ... writes the orders somewhere ...
    }
};

class OrderStore
{
public:
    virtual std::vector<Order> getOrders() const
    {
        // ... returns an array of orders ...
    }
};

class SimpleOrderManager
{
public:
    void writeAllOrders(OrderStore& orderStore, OrderWriter& orderWriter)
    {
        std::vector<Order> allOrders = orderStore.getOrders();

        if(allOrders.size() == 0)
            throw "No orders in store";
        orderWriter.writeOrders(allOrders);
    }
};

/////////////////////////////////////////////////////////////////////////////////////
//Need to mock class OrderStore as we need to return vector
//without changing original class OrderStore which is not implemented (thus not returning vector)
class MockOrderStore : public OrderStore
{
public:
    MOCK_CONST_METHOD0(getOrders, std::vector<Order> () );
};

//To check if OrderWriter::writeOrders() is called
class MockOrderWriter : public OrderWriter
{
public:
    MOCK_METHOD1(writeOrders, void (const std::vector<Order>& ) );
};

TEST(SimpleOrderManager_TestCase,  expect_call_writeOrders )
{
    std::vector<Order> aNonZeroSizeOrder{Order()};
    MockOrderStore  aMockOrderStore;
    MockOrderWriter aMockOrderWriter;
    SimpleOrderManager aSMO;
    //Call MockOrderStore::getOrders() not OrderStore::getOrders()
    //as we need to return empty vector without changing original class OrderStore
    EXPECT_CALL(aMockOrderStore, getOrders)
    .Times(1)
    .WillOnce(Return(aNonZeroSizeOrder));

/*i**************ERROR in this line **************************/
    EXPECT_CALL(aMockOrderWriter, writeOrders(aNonZeroSizeOrder)).Times(1);

    aSMO.writeAllOrders(aMockOrderStore, aMockOrderWriter);
}```

EDIT: Problems solved when I pass "_" instead of parameter as suggested by @PiotrNycz
It works when I change like this:
EXPECT_CALL(aMockOrderWriter, writeOrders(_)).Times(1);

1 Ответ

1 голос
/ 05 июня 2019

Когда вы пишете это:


EXPECT_CALL(orderWriter, writeOrders(aNonZeroSizeOrder))
    .Times(1);

Googlemock понимает это:


EXPECT_CALL(orderWriter, writeOrders(::testing::Eq(aNonZeroSizeOrder)))
//                                   ^^^^^^^^^^^^^^
    .Times(1);

Это потому, что googlemock в аргументах EXPECT_CALL() ожидает совпадения, а не значения.Когда вы предоставляете простые значения - они «молча» преобразуются в совпадения, возвращаемые ::testing::Eq(value).

Такой Eq механизм сопоставления реализован с operator== - поэтому у вас есть ошибка.

У вас есть 2 способа ее решения:

  1. add operator == к вашему классу значений
  2. используйте другое сопоставление - например, ::testing::Field - или просто ::testing::_, чтобы убедиться, что я прав.

Полный список доступных сопоставителей приведен здесь: CheatSheet.md # matchers

...