C++ ';(也许你想用&x2018;>;&x2019;?)和&x27;在gmock试验中

C++ ';(也许你想用&x2018;>;&x2019;?)和&x27;在gmock试验中,c++,pointers,googletest,googlemock,C++,Pointers,Googletest,Googlemock,我有一个使用gtest和gmock的单元测试 这些都是提供的,我应该让它们通过 我有一个RentalAdministration对象,它(在某些方法中)接受一个Car对象指针。其中一个函数如下所示: bool RentalAdministration::Add(Car *car){ if(!car){ throw invalid_argument("Car parameter can't be null!"); } if(FindCar(car->

我有一个使用gtest和gmock的单元测试

这些都是提供的,我应该让它们通过

我有一个RentalAdministration对象,它(在某些方法中)接受一个Car对象指针。其中一个函数如下所示:

bool RentalAdministration::Add(Car *car){
    if(!car){
         throw invalid_argument("Car parameter can't be null!");
    }

    if(FindCar(car->GetLicencePlate()) != NULL){
         return false;
    }

    cars.push_back(car);
    return true;
}
其中一项测试看起来像他的:

TEST(RentalAdministrationAdd, test_add_car_to_empty_administration)
{
    RentalAdministration admin;
    Car *car;
    EXPECT_CALL(car, GetLicencePlate()).WillOnce(Return("fh-01-ict"));
    EXPECT_TRUE(admin.Add(&car));
}
当我尝试进行这些测试时,我会收到大量错误,所有这些错误都是相似的:

g++ -Wall -Werror -pedantic -ggdb -O0 -std=c++98 -Iproduct -Itest test/RentalAdministrationTest.cpp product/RentalAdministration.cpp -lgtest -lgmock -lgmock_main -lpthread -o RentalAdministrationTest
In file included from /usr/include/gmock/gmock-generated-function-mockers.h:43:0,
                 from /usr/include/gmock/gmock.h:61,
                 from test/RentalAdministrationTest.cpp:2:
test/RentalAdministrationTest.cpp: In member function ‘virtual void RentalAdministrationAdd_test_add_car_to_empty_administration_Test::TestBody()’:
test/RentalAdministrationTest.cpp:13:5: error: request for member ‘gmock_GetLicencePlate’ in ‘car’, which is of pointer type ‘Car*’ (maybe you meant to use ‘->’ ?)
     EXPECT_CALL(car, GetLicencePlate()).WillOnce(Return("fh-01-ict"));
     ^
In file included from /usr/include/gtest/gtest.h:58:0,
                 from /usr/include/gmock/internal/gmock-internal-utils.h:47,
                 from /usr/include/gmock/gmock-actions.h:46,
                 from /usr/include/gmock/gmock.h:58,
                 from test/RentalAdministrationTest.cpp:2:
test/RentalAdministrationTest.cpp:14:31: error: no matching function for call to ‘RentalAdministration::Add(Car**)’
     EXPECT_TRUE(admin.Add(&car));
^

我不知道我在这里做错了什么。我刚开始用C++。< /P> 顺便说一句:我是用g++编译的,版本是98

谢谢

编辑:请原谅我没有发布这个,但是我有一个Car.h的模拟文件,它和测试本身在同一个文件夹中

#ifndef __CAR_H
#define __CAR_H

#include "gmock/gmock.h"

#include <string>
using namespace std;

class Car
{
    public:
        MOCK_CONST_METHOD0(GetLicencePlate, string());
        MOCK_METHOD0(Rent, bool());
        MOCK_METHOD1(Return, double(int kilometers));
        MOCK_METHOD0(Clean, void());
};


#endif

car
是指向
car
的指针。它的类型是:
Car*
。要从
Car*
调用
Car
成员,必须取消对指针的引用。这是在使用
car->x
语法时自动完成的,该语法相当于
(*car).x

我假设
EXPECT\u CALL
需要一个非指针参数。因此,您可以获取对
car
的引用,并将其传递给宏:

Car& car_ref = *car;
EXPECT_CALL(car_ref, GetLicencePlate()).WillOnce(Return("fh-01-ict"));

首先是指针问题,Vittorio已经说过了,但是,您还需要模拟要使用的Car对象,但_调用除外:

class MockCar : public Car{
     // Here I assume that original method is const
    MOCK_CONST_METHOD0(GetLicencePlate);
}

TEST(RentalAdministrationAdd, test_add_car_to_empty_administration)
{
    RentalAdministration admin;
    MockCar car;
    EXPECT_CALL(car, GetLicencePlate()).WillOnce(Return("fh-01-ict"));
    EXPECT_TRUE(admin.Add(&car));
}

您可以在我的示例中看到,您使用的不是真实的汽车对象,而是一个模拟对象,您可以在其中控制访问并强制返回值

我找到了解决方案

任何想知道的人:在一个班级(RentalAdministration)中,我从
cars
文件夹中包含了
Car.h
文件。(如
#包括“cars/Car.h”


但是,对于测试,应使用不同的
Car.h
。因此,更改为
#include“Car.h”
使其工作。

@πάνταῥεῖ 你怎么知道
cars
是指针?错误消息甚至不包含单词
cars
。感谢您的回答!但是我忘了注意我已经有了一个模拟文件。(它也提供了)。请查看更新的问题。谢谢您的回答。所以你建议我重写测试?@bart kn只需用我上面写的代码修复你的
test\u add\u car\u to\u empty\u administration
test-让我知道它是否解决了问题我尝试了你的建议,但它给我留下了一些其他错误。我已经更新了问题,将其中一些错误包括在内。可能是因为汽车类是抽象的吗?(它有两个虚拟纯函数)
class MockCar : public Car{
     // Here I assume that original method is const
    MOCK_CONST_METHOD0(GetLicencePlate);
}

TEST(RentalAdministrationAdd, test_add_car_to_empty_administration)
{
    RentalAdministration admin;
    MockCar car;
    EXPECT_CALL(car, GetLicencePlate()).WillOnce(Return("fh-01-ict"));
    EXPECT_TRUE(admin.Add(&car));
}