首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >‘(也许你想用’->‘?)’在gmock测试中

‘(也许你想用’->‘?)’在gmock测试中
EN

Stack Overflow用户
提问于 2016-09-01 22:41:48
回答 3查看 1.7K关注 0票数 3

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

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

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

代码语言:javascript
复制
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;
}

其中一个测试看起来像他的:

代码语言:javascript
复制
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));
}

当我尝试进行这些测试时,我得到了大量的错误,所有这些错误都是相似的:

代码语言:javascript
复制
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的模拟文件,它与测试本身在同一个文件夹中。

代码语言:javascript
复制
#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*的引用(&)。这消除了我上面提到的错误,但留下了一些其他错误:

代码语言:javascript
复制
 error: cannot declare field ‘AdminTest::car’ to be of abstract type ‘Car’
     Car car;

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

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-09-03 22:32:34

我已经找到了解决方案。

如果有人想知道:在一个类(RentalAdministration)中,我包含了cars文件夹中的Car.h文件。(如#include "cars/Car.h")

但是,对于测试,应该使用不同的Car.h。因此,更改为#include "Car.h"可以使其正常工作。

票数 0
EN

Stack Overflow用户

发布于 2016-09-01 22:43:57

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

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

代码语言:javascript
复制
Car& car_ref = *car;
EXPECT_CALL(car_ref, GetLicencePlate()).WillOnce(Return("fh-01-ict"));
票数 3
EN

Stack Overflow用户

发布于 2016-09-01 22:57:02

首先是指针问题,维托里奥已经说过了,但是,你还需要模拟汽车对象来使用EXCEPT_CALL:

代码语言:javascript
复制
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));
}

您可以在我的示例中看到,您使用的不是真正的car对象,而是一个可以控制访问和强制返回值的Mock对象

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39274556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档