c++ - '(也许你打算使用 ‘->’ ?)' 在 gmock 测试

标签 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->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++。

顺便说一句:我正在用 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

Edit1:按照建议,我尝试使用 Car* 的引用 (&)。 这消除了我上面提到的错误,但给我留下了一些其他错误:

 error: cannot declare field ‘AdminTest::car’ to be of abstract type ‘Car’
     Car car;

 error: ‘class Car’ has no member named ‘gmock_GetLicencePlate’

最佳答案

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

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

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

关于c++ - '(也许你打算使用 ‘->’ ?)' 在 gmock 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39274556/

相关文章:

C++20 协程,await_resume 返回左值,段错误

C++ 指针。如何为指针结构赋值?

c - C中取消引用和括号引用的操作顺序

c++ - Jenkins C++ 测试接线

c++ - TEST() 名称中的无下划线规则有多严格?

c++ - 计数但小错误

c++ - 时间未被计算

C++ 11 用户定义文字与 Microsoft Visual Studio 2013

c++ - 当变量恰好是指针时,如何在非成员函数中使用私有(private)成员变量?

c++ - GTest 的 EXPECT_EQ 给出未定义的错误引用