我正在尝试为项目中的某些cpp文件编写unittest案例。
这里的情景是: 我有一个cpp文件,只定义了一个公共方法,然后调用私有方法。
这里私有方法在public方法中作为回调方法调用。我如何在这里测试私有方法。我将对Callback指针进行模拟,我不知道如何调用私有方法。
请给我一些建议如何在不更改源代码的情况下调用此方案中的私有方法。
这是前:
buttonListenerList <<
sourceButton->addButtonActionCallback(std::bind(&AudioSource::buttonCallback, this, _1, _2));
这种代码的和平在公共方法中定义。现在AudioSource::buttonCallback
是一种私有方法。如何通过调用公共方法确保调用此私有方法。
答案 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)
我认为您必须考虑您想测试的内容。
如果没有看到代码,则很难进一步评论,但不要尝试测试按钮是否正常工作(调用回调)。没点意思。
因此,(私有)回调会在发生时修改状态。公开(不可变状态)并断言状态是预期的。