2017-05-30 1 views
0

私はgtestgmockに新規です。呼び出された関数を模擬する方法を教えてください。コードカバレッジにも役立ちます。場合gtestやgmockを使って、呼び出された関数の戻り値をモックすることは可能ですか?

#include <stdio.h> 
#include "gtest/gtest.h" 

int ret() 
{ 
    return 5; 
} 

class A 
{ 
    public: 
     A(); 
     int a; 
     int func(); 
}; 

A::A() 
{ 
    printf("This is constructor\n"); 
} 

int A::func() 
{ 
    int iRet = ret(); /* When func() is called by gtest I would like to control the return value of ret() */ 
    int iRet1 = ret(); 
    /* Based on these two values some operations to be done */ 
    printf("This is func. %d, %d\n", iRet, iRet1); 
    return iRet; 
} 

TEST (abc, xyz) { 
    A a; 
    EXPECT_EQ(5, a.func()); /* Here how to get different values of iRet and iRet1 for ret() function? */ 
} 

int main(int argc, char **argv) 
{ 
    ::testing::InitGoogleTest(&argc, argv); 
    return RUN_ALL_TESTS(); 
} 

それはgtestおよび/またはgmockを通して可能ではない場合、私に同じのための他のツールを提案してください。私は次のエラーを与えて実行している間

int ret() 
{ 
    printf("Returning 5\n"); 
    return 5; 
} 

int ret1() 
{ 
    int iRet = 10; 
    printf("Inside ret1\n"); 
    iRet = ret(); 
    if (iRet == 5) 
    { 
     printf("Original ret is called\n"); 
    } 
    else if (iRet == 100) 
    { 
     printf("This is mocked function call\n"); 
    } 
    else 
    { 
     printf("Opps! This should not happen\n"); 
    } 
    return iRet; 
} 

class FooMock { 
    public: 
     MOCK_METHOD0(ret, int()); 
     MOCK_METHOD0(ret1, int()); 
}; 

TEST (abc, xyz) { 
    FooMock mock; 
    EXPECT_CALL(mock, ret()).Times(1).WillOnce(Return(100)); 
    mock.ret1(); 
} 
int main(int argc, char **argv) 
{ 
    ::testing::InitGoogleMock(&argc, argv); 
    return RUN_ALL_TESTS(); 
} 

はまた、私は期待通りに動作しない、次のことを試してみました

$ ./a.out 
[==========] Running 1 test from 1 test case. 
[----------] Global test environment set-up. 
[----------] 1 test from abc 
[ RUN  ] abc.xyz 
gtest.cpp:86: Failure 
Actual function call count doesn't match EXPECT_CALL(mock, ret())... 
     Expected: to be called once 
      Actual: never called - unsatisfied and active 
gtest.cpp:87: Failure 
Actual function call count doesn't match EXPECT_CALL(mock, ret())... 
     Expected: to be called once 
      Actual: never called - unsatisfied and active 
[ FAILED ] abc.xyz (0 ms) 
[----------] 1 test from abc (0 ms total) 

[----------] Global test environment tear-down 
[==========] 1 test from 1 test case ran. (0 ms total) 
[ PASSED ] 0 tests. 
[ FAILED ] 1 test, listed below: 
[ FAILED ] abc.xyz 

1 FAILED TEST 

何が私が間違っているのなら、私に知らせてください。 ...

+0

ユニットテストの概念については、ドキュメントを参照してください。https://stackoverflow.com/documentation/unit-testing/topicsアイデアは、サンプルデータを使用してメソッドを呼び出し、その結果をあなたが知っているものと比較することです正しい結果。最初は、コードカバレッジに心配することなく、良いテストを書くことを始めました。 – Gerriet

答えて

0

したがって、単体テストのアイデアは、コードの一部を実行し、結果を期待どおりに結果を比較することです。あなたのコードは、それよりも複雑になります。例えば。

#include <stdio.h> 
#include "gtest/gtest.h" 

int incBy5(const int a) { 
    return a+5; 
} 

TEST (abc, xyz) { 
    int x=17; 
    EXPECT_EQ(x+5, incBy5(x)); 
} 

int main(int argc, char **argv) 
{ 
    ::testing::InitGoogleTest(&argc, argv); 
    return RUN_ALL_TESTS(); 
} 

一般的なユニットテストの概念とgoogle-testのドキュメントを参照してください。そのすべてを模倣することは、すべてのものをすぐに利用できない場所(ネットワークリソース、データベースなど)をテストし、これらのリソースを置き換えることができるモックアップを作成するという、より複雑なもので行われます。

0

2つ目のスニペットでは、retret1という2つのモックメソッドを定義します。その後、retに期待値を設定しますが、ret1を呼び出します。テストが終了したら、retの期待は満たされず、gmockは不平を言う。

+0

ご返信ありがとうございます。私が期待しているのは 'ret1'が' ret'の戻り値を制御しようと呼ばれているときです( 'ret'は' ret1'によって呼び出されます)。何か案が? –

+0

gmockはフリー関数を直接模倣することをサポートしていないことに注意してください。クラスメソッド、仮想クラスだけをモックする。 gmockのチュートリアル(https://github.com/google/googletest/blob/master/googlemock/docs/ForDummies.md#a-case-for-mock-turtles)を読んで、どのように動作し、どのように使用するかを理解することをお勧めします。 TL; DR: 'ret'と' ret1'メソッドを作り、 'ret'をモックアウトします。 – VladLosev

関連する問題