【发布时间】:2018-12-25 14:10:58
【问题描述】:
我的问题是我想模拟一个 Static Non-Virtual 方法来返回 true,最终返回 false。
我有静态方法 例如:
class SomeClass{
public:
static bool SomeClass::DoAction() {
// do some Actions
};
};
我想在模拟期间始终返回 true,但默认情况下返回 false, 反正有什么可以模拟的吗
我尝试了以下方法来检查 on call 值并找出它导致错误。
class MockSomeClass : public SomeClass {
public:
MockSomeClass() {
ON_CALL(this, DoAction).WillByDefault(testing::Return(true));
}
virtual ~MockSomeClass(){};
MOCK_METHODO(DoAction, bool());
由于Mock是用来离开函数的,有什么方法可以为函数返回一个特定的值,或者将返回值替换为true,继续在C++中使用gmock和gtest进行测试的操作。 考虑下面的例子 例如:
FunctionA(){
if (SomeClass::DoAction()){
// do Actions - I wanted to pass the call do the actions.
}
};
这里我想在 if true 的情况下测试动作,有什么方法可以在不更改任何底层代码的情况下测试上述方法。
我尝试了该方法中存在的不同方法,但仍然无法获得确切的解决方案。 https://github.com/google/googletest/tree/master/googlemock/docs
-
使用默认值
using ::testing::DefaultValue; DefaultValue<bool>::Set(true); // call the mock methods DefaultValue<bool>::Clear(); 使用 Invoke,这不起作用,因为静态方法是非 void。
除了上面提到的方法之外,有没有其他解决方案。
【问题讨论】:
-
我的问题无法解决,因为我需要在不编辑实际代码的情况下进行测试。
-
不能改代码吗?如果可以,您可以制作
FunctionA:template <typename T> FunctionA { if(T::DoAction()) {...}}的模板。然后在您的生产代码中您将传递SomeClass作为模板参数,在您的测试代码中您将传递MockSomeClass。这不是一个好方法,但我想不出其他方法。
标签: c++ unit-testing googletest googlemock