Я впервые использую 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);