2016-09-01 20 views
2

私はgtestとgmockを使ってユニットテストをしています。'gmockテストで' - > '?)'を使用するつもりでした。

これらは提供されていますが、私の順番でそれらを通過させる必要があります。

私は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++から始めます。

ところで:私は、グラムでコンパイル++とバージョン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:示唆したように、私は車の参照(&)*を使用しようとしました。 これは私が上記しましたエラーを殺し、他のいくつかのエラーで私の葉:

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

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

@πάνταῥε 'あなたは' cars'がポインタであることをどのように知っていますか?エラーメッセージには「cars」という単語も含まれていません。 –

答えて

0

値を制御することができますモック1を使用していない私のexamleで見ることができます。

疑問に思っている人のために:carsフォルダのCar.hファイルを1つのクラス(RentalAdministration)の中に入れました。 (#include "cars/Car.h"のように)

しかし、テストのために異なるCar.hが使用されるべきです。したがって、#include "Car.h"に変更すると機能しました。

3

carCarへのポインタです。そのタイプはCar*です。 CarのメンバーをCar*から呼び出すには、ポインタを参照解除する必要があります。これはcar->x構文を使用すると自動的に行われます。これは(*car).xに相当します。

EXPECT_CALLにはポインタ以外の引数が必要であると仮定します。そのため、あなたはcarへの参照を取得し、マクロにそれを渡すことができます:

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

あなたの答えをありがとう。あなたはテストを書き直すことを提案していますか? –

+0

@ bart-knこれまでに書いたコードで 'test_add_car_to_empty_administration'テストを修正しました。問題が解決したら教えてください。 –

+0

私が提案したことを試しましたが、いくつかのエラーが表示されました。これらのエラーのいくつかを含めるように質問を更新しました。車のクラスが抽象的なのかもしれませんか? (それは2つの仮想純関数を持っています) –

1

まずも、あなたがEXCEPT_CALLを使用する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)); 
} 

は、あなたが実際の車のオブジェクトが、あなたがアクセスし、力のリターンは、私は解決策を見つけた

+0

あなたの答えをありがとう!しかし、私はすでにモックファイルを持っていることに注意するのを忘れていました。 (それも同様に提供されています)。更新された質問をご覧ください。 –

関連する問題