2017-05-30 31 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(); 
} 

請參閱單元測試概念的文檔,特別是谷歌測試。這一切的嘲弄方面進入的地方有更復雜的事情來測試,你可能沒有一切現成的(例如網絡資源,數據庫,...),並創建實體模型,可以替代這些資源。

0

在你的第二個片段中,你定義了兩個模擬方法,retret1。稍後,您對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

相關問題