GMock:覆盖默认期望
GMock: Overriding a default expectation
在GMock中,是否可以替换先前设置的期望?
假设,一个测试套件对一个特定的方法调用有一个默认的期望,这是大多数测试用例想要的:
class MyClass {
public:
virtual int foo() = 0;
};
class MyMock {
public:
MOCK_METHOD0(foo, int());
};
class MyTest: public Test {
protected:
void SetUp() {
EXPECT_CALL(m_mock, foo()).WillOnce(Return(1));
}
MyMock m_mock;
};
TEST_F(MyTest, myTestCaseA) {
EXPECT_EQ(1, m_mock.foo());
}
工作正常。然而,一些测试用例有不同的期望。如果我添加一个新的期望,如下所示,它不会工作。
TEST_F(MyTest, myTestCaseB) {
EXPECT_CALL(m_mock, foo()).WillOnce(Return(2));
EXPECT_EQ(2, m_mock.foo());
};
我得到这个消息:
[ RUN ] MyTest.myTestCaseB
/home/.../MyTest.cpp:94: Failure
Actual function call count doesn't match EXPECT_CALL(m_mock, foo())...
Expected: to be called once
Actual: never called - unsatisfied and active
[ FAILED ] MyTest.myTestCaseB (0 ms)
我明白为什么我得到这个。问题是,如果一个测试用例指定了它自己,如何取消默认的期望?GMock是否允许这样做,或者我可以使用什么方法来实现预期的行为?
不,没有办法清除任意的期望。您可以使用VerifyAndClearExpectations
清除所有,这可能比您想要的更多。我可以想到几个替代方案来避免这个问题:
-
您可以通过简单地提前调用一次
m_mock.foo()
来解决您的问题,从而满足最初的期望。TEST_F(MyTest, myTestCaseB) { EXPECT_CALL(m_mock, foo()).WillOnce(Return(2)); (void)m_mock.foo(); EXPECT_EQ(2, m_mock.foo()); }
-
另一种替代方法是更改期望,使其返回变量的值,然后在测试体之前更新变量,如从模拟方法返回实时值下面的烹饪书中所述。例如:
void SetUp() { m_foo_value = 1; EXPECT_CALL(m_mock, foo()).WillOnce(Return(ByRef(m_foo_value))); } TEST_F(MyTest, myTestCaseB) { m_foo_value = 2; EXPECT_EQ(2, m_mock.foo()); }
-
另一种选择是分别指定返回值和计数。
void SetUp() { ON_CALL(m_mock, foo()).WillByDefault(Return(1)); EXPECT_CALL(m_mock, foo()).Times(1); }
然后,您只需要为特殊测试指定一个新的返回值:
TEST_F(MyTest, myTestCaseB) { ON_CALL(m_mock, foo()).WillByDefault(Return(2)); EXPECT_EQ(2, m_mock.foo()); }
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 如何使用默认参数等选择模板专业化
- 具有默认模板参数的多态类的模板推导失败
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 初始化具有非默认构造函数的std::数组项的更好方法
- 何时提供默认参数作为模板参数
- 是默认情况下分配给char数组常量的值
- 具有默认值的引用获取函数
- 具有默认模板类型的默认构造函数的类型推导
- 当给定默认值时,为什么此模板参数推导失败
- 修改 VS Code 中的默认C++代码段
- 声明默认的模板化函数
- 将const引用参数初始化为默认参数会导致悬空引用吗
- 如何使用非默认构造函数实例化模板化类
- 如何修复带有 clang 的参数'args'缺少默认参数的问题?
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 为什么大多数 pair 实现默认不使用压缩(空基优化)?
- std::throw_with_nested期望Exception的虚基类的默认构造函数
- GMock:覆盖默认期望