【发布时间】:2019-05-10 08:36:59
【问题描述】:
我正在使用 Google Test api 对 C++ 代码进行单元测试。
使用 google 测试 API 示例,我看到有一个选项可以使用 FRIEND_TEST 宏测试私有方法。我还看到了用于参数化测试的 TEST_P、INSTANTIATE_TEST_CASE_P 宏。
所以我尝试了以下逻辑来实现私有方法的参数化单元测试。但是我遇到了 'Foo::Bar' 错误:无法访问在类 'Foo' 中声明的私有成员。当我尝试使用类 FRIEND_TEST_Test3 使用参数化测试宏 TEST_P 进行测试时。
所以请告诉我使用 Google 测试宏通过参数化单元测试来测试私有方法的可能方法。
class Foo {
public:
Foo() {}
private:
int Bar() const { return 1; }
FRIEND_TEST(FRIEND_TEST_Test, TEST);
FRIEND_TEST(FRIEND_TEST_Test2, TEST_F);
FRIEND_TEST(FRIEND_TEST_Test3, TEST_P);
};
TEST(FRIEND_TEST_Test, TEST) {
ASSERT_EQ(1, Foo().Bar());
}
class FRIEND_TEST_Test2 : public ::testing::Test {
public:
Foo foo;
};
TEST_F(FRIEND_TEST_Test2, TEST_F) {
ASSERT_EQ(1, foo.Bar());
}
class CodeLocationForTESTP : public ::testing::TestWithParam<int> {
};
INSTANTIATE_TEST_CASE_P(, CodeLocationForTESTP, ::testing::Values(0,1,2,1,0));
TEST_P(CodeLocationForTESTP, Verify) {
ASSERT_TRUE(0==GetParam());
}
class FRIEND_TEST_Test3 : public ::testing::Test,public ::testing::TestWithParam<int> {
public:
Foo foo;
};
INSTANTIATE_TEST_CASE_P(, FRIEND_TEST_Test3, ::testing::Values(0,1,2,1,0));
TEST_P(FRIEND_TEST_Test3, Verify) {
ASSERT_EQ(1, foo.Bar());
}
【问题讨论】:
-
我个人会质疑测试私有方法的价值。它们是“实施细节”。就其本质而言,客户端程序员不会使用它们,并且它们的“接口”比公共方法更频繁地更改。
标签: c++ unit-testing googletest