C++ ';(也许你想用&x2018;>;&x2019;?)和&x27;在gmock试验中
我有一个使用gtest和gmock的单元测试 这些都是提供的,我应该让它们通过 我有一个RentalAdministration对象,它(在某些方法中)接受一个Car对象指针。其中一个函数如下所示: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->
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));
}