测试用例状态失败但返回值为真
Test Cases states Failed but value returned is true
我写了一个简单的示例代码来理解用于单元测试的 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));
};
下面是我的测试代码——我只想调用 class A 的 ShowPub2 方法。我期待语句 A::PUBLIC::SHOW..2 在控制台打印 - 但它并没有发生,测试用例也失败了,尽管该方法被硬编码为 return 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;
}
这里需要澄清一下..
创建 Mock
class 意味着 Mock 方法是用自己的实现生成的。这行代码
MOCK_METHOD0(ShowPub1, void());
MOCK_METHOD1(ShowPub2, int(int x));
并不意味着它将调用 ShowPub1 / ShowOub2
的父实现。这仅意味着您将获得一个与您正在模拟的 class 签名相同的函数 (Mock)。
由于这一行,测试失败
EXPECT_TRUE(a.ShowPub2(2));
由于没有调用原来的实现,所以这个函数失败了。
测试函数应该写成
TEST(FirstA, TestCall) {
MockA a;
EXPECT_CALL(a, ShowPub2(2)) .Times(AtLeast(1));
a.ShowPub2(2);
}
此处您正在测试函数至少被调用一次的行为,并且测试将成功。
如果要测试函数的功能,请编写单独的测试。在这种情况下模拟将无法解决问题。
我写了一个简单的示例代码来理解用于单元测试的 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));
};
下面是我的测试代码——我只想调用 class A 的 ShowPub2 方法。我期待语句 A::PUBLIC::SHOW..2 在控制台打印 - 但它并没有发生,测试用例也失败了,尽管该方法被硬编码为 return 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;
}
这里需要澄清一下..
创建 Mock
class 意味着 Mock 方法是用自己的实现生成的。这行代码
MOCK_METHOD0(ShowPub1, void());
MOCK_METHOD1(ShowPub2, int(int x));
并不意味着它将调用 ShowPub1 / ShowOub2
的父实现。这仅意味着您将获得一个与您正在模拟的 class 签名相同的函数 (Mock)。
由于这一行,测试失败
EXPECT_TRUE(a.ShowPub2(2));
由于没有调用原来的实现,所以这个函数失败了。
测试函数应该写成
TEST(FirstA, TestCall) {
MockA a;
EXPECT_CALL(a, ShowPub2(2)) .Times(AtLeast(1));
a.ShowPub2(2);
}
此处您正在测试函数至少被调用一次的行为,并且测试将成功。
如果要测试函数的功能,请编写单独的测试。在这种情况下模拟将无法解决问题。