测试用例状态失败但返回的值为true

时间:2017-07-31 05:46:24

标签: c++ gmock

我已经编写了一个简单的示例代码来理解用于单元测试的GMOCK:

#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));
};

下面是我的测试代码 - 我只想调用A类的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;
}

1 个答案:

答案 0 :(得分: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);
  }

在这里,您要测试函数至少被调用一次的行为,并且测试将成功。

如果要测试函数的功能,请编写单独的测试。在这种情况下,模拟不会解决问题。