如何在gtest中测试setter方法
How to test setter methods in gtest?
我听说使用gtest我们应该测试测试类的所有公共方法。但是setter方法会改变private/protected的值吗?我应该如何测试它?在下面的例子。
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;
};
EDIT: format()方法添加
我找到了问题的答案。在测试之前,我创建了一个继承自formatter的新类。然后,在这个类中,我实现了getter方法来测试父类中的公共setter方法。
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));
}
测试设置private/protected变量的效果。例如:
std::ostringstream a, b;
a << 32;
ASSERT_EQ(a.str(),"32");
b << std::hex() << 32;
ASSERT_EQ(b.str(),"20");
在本例中,'std::hex()'为ostringstream设置了一些内部格式,您可以在.str()输出中看到。
关于不应该进行单元测试的观点有很多要说的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
类的友元,因此它可以访问受保护和私有成员。
在这里,您可以看到解决方案在您需要的意义上是侵入性的Formatter.h
中包含gtest_prod.h
。但是gtest_prod.h
本身不携带行李——这是代码因此,您可以将此头文件包含在您的软件发行版中,而无需产生任何依赖。没有必要把googletest作为一个整体捆绑到你的发行版中。
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 尽管测试成功,CppUnit测试核心仍被丢弃.为什么
- 数据成员SFINAE的C++17测试:gcc vs clang
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么二进制搜索在我的测试中不起作用
- 从父数组测试用例构造二叉树失败
- 试图对缓存进行跨步测试,但程序并没有结束
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- OpenGL在启用深度测试时不会丢弃我的碎片
- 为测试目标创建具有不同源文件夹的文件
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- VC++本机单元测试,找不到调试符号
- 换位表导致测试失败(但在游戏中运行良好)
- 用于交叉编译和CMake的预处理器宏的单元测试
- 谷歌测试中的期望值存储在哪里
- 如何在for循环中包含两个索引值的测试条件
- 在cygwin中测试新的boost安装时出现cpp错误
- 使用rdtsc进行基准测试的缺点是什么
- 如何在gtest中测试setter方法