如何在gtest中测试setter方法

How to test setter methods in gtest?

本文关键字:测试 setter 方法 gtest      更新时间:2023-10-16

我听说使用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作为一个整体捆绑到你的发行版中。

进一步阅读