2016-04-07 67 views
0

私はあなたの助けが必要な非仮想メソッドを嘲笑する問題に遭遇しています。 私はリンクを参照しました:Mock non-virtual method giving compilation errorGmockでCppの別の非仮想メソッドで非仮想メソッドをモック

私は彼らが何をしたのか理解しました。しかし、私は高度な質問があります。私が持っていると仮定します

*/ 
#include <iostream> 
#include <gtest/gtest.h> 
#include <gmock/gmock.h> 

using ::testing::Invoke; 
using ::testing::NiceMock; 

template <class myclass> class Templatemyclass { 
public: 
    myclass T; 
    void show() ; 
}; 

template <class myclass> void Templatemyclass<myclass>::show() 
{ 
    T.show_text(); 
} 

struct Test { 

    void display() { std::cout << __func__<<":-->Inside the display Test\n"; } 

    void show_text() { 
     display(); // HOW to re-route it to my_display() ? (>.<) 
    } 
}; 

struct MockTest { 
    MOCK_CONST_METHOD0(display, void()); 
    MOCK_CONST_METHOD0(show_text, void()); 
}; 

void my_display(){ 
    { std::cout <<__func__<<":-->Outside the display Test\n"; } 
} 

int main() { 
    //NiceMock<Templatemyclass<Test> > obj1; 
    //obj1.show(); 

    NiceMock<Templatemyclass<MockTest> > obj2; 
    EXPECT_CALL(obj2.T, display()) 
     .Times(1) 
     .WillOnce(Invoke(my_display)); 
    obj2.show(); 

    return 0; 
} 

私はshow_textが呼び出されたとき、displayを呼び出すために起こっていることをしたいと思います。私はdisplayをモックしてmy_displayに再ルーティングしようとしましたが、失敗しました。私はエラーが発生しました。

../test_program.cpp:56: Failure 
Actual function call count doesn't match EXPECT_CALL(obj2.T, display())... 
     Expected: to be called once 
      Actual: never called - unsatisfied and active 

上記のソースコードを少し変更する。それは働くことができるが、これは私の期待を逸した。私は模擬displayshow_textで呼びかけたいと思います。

template <class myclass> class Templatemyclass { 
public: 
    myclass T; 
    void show() ; 
}; 

template <class myclass> void Templatemyclass<myclass>::show() 
{ 
    T.display(); 
} 

struct Test { 

    void display() { std::cout << __func__<<":-->Inside the display Test\n"; } 

// void show_text() { 
// display(); // HOW to re-route it to my_display() ? (>.<) 
// } 
}; 

struct MockTest { 
    MOCK_CONST_METHOD0(display, void()); 
    MOCK_CONST_METHOD0(show_text, void()); 
}; 

void my_display(){ 
    { std::cout <<__func__<<":-->Outside the display Test\n"; } 
} 

int main() { 
    NiceMock<Templatemyclass<Test> > obj1; 
    obj1.show(); 

    NiceMock<Templatemyclass<MockTest> > obj2; 
    EXPECT_CALL(obj2.T, display()) 
     .Times(1) 
     .WillOnce(Invoke(my_display)); 
    obj2.show(); 

    return 0; 
} 

、画面を示しています。

display:-->Inside the display Test 
my_display:-->Outside the display Test 

私は、この問題をクリアする助けてください。

+0

GMockのドキュメントを読むと、すべての模擬クラスに仮想インターフェイスが必要であると言われましたか? –

+0

可能です、Richard。あなたは私の編集されたポストを見てみることができます –

答えて

1

TESTまたはTEST_FマクロのうちEXPECT_CALLを使用することはできません。あなたの主な機能はランナーを呼び出す必要があります。mainにあるコードをTESTに入れてください。 the docsを確認してください。

+0

私のソースはうまく動いているので、これは可能だと思います。 私はあなたの言ったように少し変更します。私はまだこの問題にぶつかる。 –

+0

あなたはコードを実行することができますが、適切な出力、コマンドラインオプションの働き、戻りコードの適切な設定(すべてのテストが正常に実行された場合は0、それ以外の場合は1)が必要です。 –

関連する問題