如何使用gtest对std :: bind函数进行单元测试?

时间:2016-06-02 11:52:41

标签: c++ unit-testing googletest googlemock gmock

我正在尝试为项目中的某些cpp文件编写unittest案例。

这里的情景是: 我有一个cpp文件,只定义了一个公共方法,然后调用私有方法。

这里私有方法在public方法中作为回调方法调用。我如何在这里测试私有方法。我将对Callback指针进行模拟,我不知道如何调用私有方法。

请给我一些建议如何在不更改源代码的情况下调用此方案中的私有方法。

这是前:

buttonListenerList <<
 sourceButton->addButtonActionCallback(std::bind(&AudioSource::buttonCallback, this, _1, _2));

这种代码的和平在公共方法中定义。现在AudioSource::buttonCallback是一种私有方法。如何通过调用公共方法确保调用此私有方法。

3 个答案:

答案 0 :(得分:2)

如果,(你在评论中回答是肯定的)sourceButton可以被模拟 - 那么期望调用addButtonActionCallback - 并存储传递的std::function<> arg。

与下面的例子类似(用实际类型替换...):

struct TestSuite : public ::testing::Test {
   ...  sourceButtonMock;
   std::unique_ptr<...>  objectUnderTest;
   void SetUp() override;
   std::function<...>  sourceButtonActionCallback;
};
using namespace ::testing;
void TestSuite::SetUp()
{
    EXPECT_CALL(sourceButtonMock, addButtonActionCallback(_))
          .WillOnce(SaveArg<0>(&sourceButtonActionCallback);
    objectUnderTest = std::make_unique<...>(sourceButtonMock);
}

将此回调存储在sourceButtonActionCallback成员变量中 - 您可以随意在任何地方调用它:

TEST_F(TestSuite, shallDo...OnSourceButtonClick)
{
   // prerequisites
   ASSERT_NE(sourceButtonActionCallback, nullptr);

   // Expecteations
   ...

   // action
   sourceButtonActionCallback(...);

   // post-assertions
   ...
}

答案 1 :(得分:0)

在单元测试中,您不会测试私有成员函数,只测试公共成员函数。

我有一个大型项目,它使用map,其function列表中包含与其绑定的参数。我用不同的参数调用public方法,这些参数又调用map中的各种函数。然后,我可以检查响应状态(错误代码,因为这是多线程)以验证正确的行为。这是你应该在你的场景中做的。

调用公共函数并在最后检查状态。

答案 2 :(得分:0)

我认为您必须考虑您想测试的内容。

  • 如果您想测试按下按钮时是否会调用回调,您不需要公开您的私人方法,事实上,您不需要这样做,因为按钮&# 34;已经证明&#34;。按下按钮时,将调用相关的回调。
  • 如果你想测试你的私有函数是否做了他们应该做的事情,回调的结果应该修改一些状态(可以通过getter公开)。然后,您需要一种方法来调用按钮事件,或者您可以使用可以通过按钮和测试公开的虚拟功能。

如果没有看到代码,则很难进一步评论,但不要尝试测试按钮是否正常工作(调用回调)。没点意思。

因此,(私有)回调会在发生时修改状态。公开(不可变状态)并断言状态是预期的。