2017-07-31 55 views
0

我已经写了一个简单的示例代码来了解用于单元测试GMOCK:测试用例失败国家,但返回的值是true

#include <iostream> 
#include "gmock/gmock.h" 
#include "gtest/gtest.h" 
using ::testing::AtLeast; 
class A { 
public: 
    void ShowPub1() 
    { 
     std::cout << "A::PUBLIC::SHOW..1" << std::endl; 
    } 
    int ShowPub2(int x) 
    { 
     std::cout << "A::PUBLIC::SHOW..2" << std::endl; 
     return true; 
    } 
}; 

class MockA : public A{ 
public: 
    MOCK_METHOD0(ShowPub1, void()); 
    MOCK_METHOD1(ShowPub2, int(int x)); 
}; 

下面是我的测试代码 - 我只是想叫类的ShowPub2方法答:我期待的声明A :: PUBLIC :: SHOW..2打印机会在控制台 - 但它只是没有发生,测试用例也未能虽然该方法是硬编码返回true:

TEST(FirstA, TestCall) { 
    MockA a; 
    EXPECT_CALL(a, ShowPub2(2)) 
     .Times(AtLeast(1)); 
    a.ShowPub2(2); 
    EXPECT_TRUE(a.ShowPub2(2)); 
} 

GMOCK测试代码执行输出 - 我不是知道为什么输出A :: PUBLIC :: SHOW..2没有控制台和测试用例渲染失败:

[==========] Running 1 test from 1 test case. 
[----------] Global test environment set-up. 
[----------] 1 test from FirstA 
[ RUN  ] FirstA.TestCall 
c:\users\user1\documents\c and c++\gmock\gmock1\gmock1\gmock1.cpp(78): error: 
Value of: a.ShowPub2(2) 
    Actual: false 
Expected: true 
[ FAILED ] FirstA.TestCall (0 ms) 
[----------] 1 test from FirstA (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 ] FirstA.TestCall 

1 FAILED TEST 
Press any key to continue . . . 



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

嘲笑方法必须是虚拟:https://github.com/google/googlemock/blob/master/googlemock/docs/ForDummies.md。 – Gluttton

+0

我让我的两种方法都是虚拟的,但仍是同样的问题 - 我错过了什么?虚拟无效ShowPub1(){}和虚拟INT ShowPub2(INT X){} – Prakash

回答

1

这里需要一些澄清..

创建Mock类指Mock方法是用它自己的实现生成的。这些代码行

MOCK_METHOD0(ShowPub1, void()); 
MOCK_METHOD1(ShowPub2, int(int x)); 

并不意味着它会调用父ShowPub1/ShowOub2执行。这只意味着你将得到一个与你正在嘲笑的类相同签名的函数(模拟)。

测试失败,因为这条线

EXPECT_TRUE(a.ShowPub2(2)); 

由于原来实行不叫的,这个功能失效。

的测试功能应该写成

TEST(FirstA, TestCall) { 
    MockA a; 
    EXPECT_CALL(a, ShowPub2(2)) .Times(AtLeast(1)); 
    a.ShowPub2(2); 
    } 

在这里,我们测试的行为,该函数被调用至少一次,测试会成功这一点。

如果你想测试一个函数的功能,编写不同的测试。在这种情况下,嘲笑不会解决问题。

+0

谢谢 - 那么当我们做嘲笑的功能,主要用于测试接口的行为,它是用于 – Prakash

+1

嘲讽什么。例如,您将'Mock a'传递给期望'class A'作为参数的函数。在这里面,你可以做一些使用'A类'中定义的函数的功能。嘲笑只是为了验证相同。使用'EXPECT'来找出函数行为 –

+0

您能否提供测试用例代码来测试我的类方法实现?我试图做同样的事情,但编译器声明 - “错误C2039:'gmock_ShowPub2':不是'A'的成员,用于EXPECT_CALL(a,ShowPub2(2))。当我没有创建模拟类和直接编写测试用例 – Prakash