googlemock EXPECT_CALL 具有小的行为变化
googlemock EXPECT_CALL with small behaviour variations
在 googlemock 和 googletest 的帮助下,我设置了一个测试来检查被测方法是否正确处理了不同的模拟错误。基本上我的代码是这样的:
// setup mock object, and object under test
// setup initial EXPECT_CALL expectations
// this expected method call in the middle mocks a failure
EXPECT_CALL(*mock, method(arg_in)).
Times(1).
WillOnce(Throw(exception_of_type_A));
// setup cleanup EXPECT_CALL expectations
// Now invoke method in object under test.
// Expect exception has been translated to different type.
EXPECT_THROW(x.method_under_test(), exception_type_B);
// destructor of mock object will check the mock method invocations
现在,我在这里失败的模拟方法不仅会因抛出类型 A 的异常而失败,还会因抛出类型 B 的异常而失败,或者因 return 意外的 return 值而失败.
我可以通过复制和粘贴完整的 TEST() 并仅更改行为不当的模拟 method1 将执行的操作来轻松实现此目的。但是这样会使代码变得混乱。即使我记录这 3 个测试完全相同,除了模拟方法 1 在 WillOnce() 操作规范中如何失败,如果这仍然是真的,人类 reader 仍然需要仔细比较。
在 googletest/googlemock 中共享三个测试之间的通用代码并使它们在 WillOnce() 操作中有所不同的正确方法是什么?
我想到的是:宏、循环使用 WillOnce() 操作的容器、googletest fixtures、用于设置和清理的静态辅助方法。
我还是 googletest 的新手,不知道如何解决这个问题。
现在,我在接受动作作为参数的模板化静态函数中实现测试逻辑:
template <typename A>
static void paramererizeable_test(A failingAction) {
// set everything up
EXPECT_CALL(*mock, method(arg_in)).
Times(1).
WillOnce(failingAction);
// set up more expectations
// trigger the calls
}
TEST(Section, Method) {
paramererizeable_test(Throw(exception_of_type_A));
paramererizeable_test(Throw(exception_of_type_B));
paramererizeable_test(Return(unexpected_return_value));
}
不确定是否应该这样做,或者是否有更好的方法,但它有效且可读。
在 googlemock 和 googletest 的帮助下,我设置了一个测试来检查被测方法是否正确处理了不同的模拟错误。基本上我的代码是这样的:
// setup mock object, and object under test
// setup initial EXPECT_CALL expectations
// this expected method call in the middle mocks a failure
EXPECT_CALL(*mock, method(arg_in)).
Times(1).
WillOnce(Throw(exception_of_type_A));
// setup cleanup EXPECT_CALL expectations
// Now invoke method in object under test.
// Expect exception has been translated to different type.
EXPECT_THROW(x.method_under_test(), exception_type_B);
// destructor of mock object will check the mock method invocations
现在,我在这里失败的模拟方法不仅会因抛出类型 A 的异常而失败,还会因抛出类型 B 的异常而失败,或者因 return 意外的 return 值而失败.
我可以通过复制和粘贴完整的 TEST() 并仅更改行为不当的模拟 method1 将执行的操作来轻松实现此目的。但是这样会使代码变得混乱。即使我记录这 3 个测试完全相同,除了模拟方法 1 在 WillOnce() 操作规范中如何失败,如果这仍然是真的,人类 reader 仍然需要仔细比较。
在 googletest/googlemock 中共享三个测试之间的通用代码并使它们在 WillOnce() 操作中有所不同的正确方法是什么?
我想到的是:宏、循环使用 WillOnce() 操作的容器、googletest fixtures、用于设置和清理的静态辅助方法。
我还是 googletest 的新手,不知道如何解决这个问题。
现在,我在接受动作作为参数的模板化静态函数中实现测试逻辑:
template <typename A>
static void paramererizeable_test(A failingAction) {
// set everything up
EXPECT_CALL(*mock, method(arg_in)).
Times(1).
WillOnce(failingAction);
// set up more expectations
// trigger the calls
}
TEST(Section, Method) {
paramererizeable_test(Throw(exception_of_type_A));
paramererizeable_test(Throw(exception_of_type_B));
paramererizeable_test(Return(unexpected_return_value));
}
不确定是否应该这样做,或者是否有更好的方法,但它有效且可读。