'(maybe you meant to use ‘->’ ?)' 在 gmock 测试中
'(maybe you meant to use ‘->’ ?)' in gmock test
我有一个使用gtest和gmock的单元测试。
这些是提供的,而我应该让它们通过。
我有一个RentalAdministration Object,它(在一些方法中)接受一个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++。
btw:我正在用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"));
首先是指针问题,Vittorio已经说过了,但是,您还需要模拟Car对象来使用EXCEPT_CALL:
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
文件。(如#include "cars/Car.h"
)
但是,对于测试,应该使用不同的Car.h
。因此,更改为#include "Car.h"
使其工作
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 尽管测试成功,CppUnit测试核心仍被丢弃.为什么
- 数据成员SFINAE的C++17测试:gcc vs clang
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么二进制搜索在我的测试中不起作用
- gmock / google-mock发出警告,并且通过模拟异常未通过测试
- C++ gmock - 我们如何在单元测试 cpp 文件中读取/获取 cpp 文件函数的参数值
- 在类 gtest/gmock 进行单元测试时模拟成员函数C++
- 使用 C++ GMock 匹配器测试unordered_map的密钥是否来自一组密钥
- gmock EXPECT_CALL 不会在测试类中调用该方法
- 您如何模拟一个正在测试GMOCK的函数
- GMock 测试夹具在 Windows 上崩溃
- 如何使用gmock框架模拟c++单元测试中的fork和execlp系统调用
- 使用GTEST和GMOCK进行测试:共享与静态库
- gmock - 测试模拟方法参数
- QTestLib 单元测试框架 + Gmock (Create QTCPServer语言 - Mock Object).
- 使用gmock测试依赖于QApplication的函数
- 如何使用 gmock 来测试类是否调用其基类的方法
- '(maybe you meant to use ‘->’ ?)' 在 gmock 测试中