googlemock EXPECT_CALL具有较小的行为变化

时间:2017-04-14 20:57:40

标签: c++ googletest googlemock

在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的异常或通过返回意外的返回值来实现。

我可以通过复制和粘贴完整的TEST()来轻松地实现这一点,并且只是改变行为不当的模拟方法1将会做什么。但这会使代码变得混乱。即使我记录这三个测试完全相同,除了模拟方法1在WillOnce()动作规范中如何失败,人类读者仍然需要仔细比较是否仍然如此。

googletest / googlemock在三个TESTS之间共享公共代码的正确方法是什么,只是让它们在WillOnce()动作中有所区别?

我的想法来了:宏,循环使用WillOnce()动作的容器,googletest fixtures,用于设置和清理的静态帮助方法。

我还是googletest的新手,不知道如何解决这个问题。

1 个答案:

答案 0 :(得分:0)

现在,我在一个模板化静态函数中实现测试逻辑,该函数接受一个动作作为参数:

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));
}

不确定这是否应该如何完成,或者是否有更好的方法,但它有效且可读。