如何在gtest中测试setter方法?

时间:2014-05-19 10:48:49

标签: c++ unit-testing googletest

我听说使用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()方法。

3 个答案:

答案 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作为一个整体捆绑到您的发行版中。

Further reading