我听说使用gtest我们应该测试所有测试类的公共方法。但是改变私人/受保护的价值的setter方法怎么样?我该怎么测试呢?示例如下。
class Formatter
{
public:
Formatter();
void setFormat(std::string format)
{
formatPattern = format;
}
std::string format(ExampleObject objectToFormat)
{
//do something with objectToFormat using protected formatPattern
//and put output to std::string retval
return retval;
}
protected:
std::string formatPattern;
};
编辑:添加了format()方法。
答案 0 :(得分:2)
我找到了问题的答案。在测试之前,我创建了一个继承自formatter的新类。然后,在这个类中,我实现了在父类中测试我的公共setter方法所必需的getter方法。
namespace consts {
std::string simpleFormatPattern = "@name @severity @message";
std::string formatterOutput = "error ERROR Here is some message";
LogEntry logEntry("error","Here is some message", ERROR);
} //namespace consts
class ut_formatter : public Formatter
{
public:
ut_formatter()
{}
~ut_formatter()
{}
std::string getFormatPattern(void)
{
return formatPattern;
}
};
TEST(ut_formatter, SetFormatOk)
{
ut_formatter formatter;
formatter.setFormat(consts::simpleFormatPattern);
ASSERT_EQ(consts::simpleFormatPattern, formatter.getFormatPattern());
}
TEST(ut_formatter, FormatOk)
{
ut_formatter formatter;
formatter.setFormat(consts::simpleFormatPattern);
ASSERT_EQ(consts::formatterOutput, formatter.format(consts::logEntry));
}
答案 1 :(得分:1)
您测试设置私有/受保护变量的效果。例如:
std::ostringstream a, b;
a << 32;
ASSERT_EQ(a.str(),"32");
b << std::hex() << 32;
ASSERT_EQ(b.str(),"20");
在这个例子中,&#39; std :: hex()&#39;为ostringstream设置一些内部格式,你可以在.str()输出中看到。
答案 2 :(得分:0)
对于您不应该单元测试的观点有很多话要说 API的内部,只是公共行为。如果你决定这样做 无论如何,googletest方式我们使用宏:
FRIEND_TEST(TestCaseName, TestName)
,在标题gtest/gtest_prod.h
中定义。
这是一个示例测试运行器,将其应用于您的班级Formatter
:
<强> Formatter.h 强>
#include "gtest/gtest_prod.h"
#include <string>
class Formatter
{
FRIEND_TEST(t_Formatter_setFormat, t_formatPatternSetCorrect);
public:
Formatter(){};
void setFormat(std::string format)
{
formatPattern = format;
}
// Methods, methods...
protected:
std::string formatPattern;
};
测试跑步者
#include "Formatter.h"
#include "gtest/gtest.h"
#include <string>
TEST(t_Formatter_setFormat, t_formatPatternSetCorrect) {
Formatter f;
f.setFormat("A%Format%Pattern");
EXPECT_EQ(f.formatPattern,"A%Format%Pattern");
}
int main(int argc, char **argv)
{
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
正如你猜的那样,
FRIEND_TEST(t_Formatter_setFormat, t_formatPatternSetCorrect);
只是让测试成为类Formatter
的朋友,因此它可以访问受保护的
和私人成员。
你在这里看到解决方案在你需要的意义上是侵入性的
在gtest_prod.h
中添加Formatter.h
。但是gtest_prod.h
本身
没有行李 - 这里the code
所以你可以在没有软件分发的情况下包含这个标题
引发任何依赖。无需将googletest作为一个整体捆绑到您的发行版中。