【问题标题】:Changing gmock expectation改变 gmock 期望
【发布时间】:2013-11-06 02:35:39
【问题描述】:

我想在 GMock 中编写一个单元测试。但是,我主要熟悉 Mockito。我会用 Mockito 写的是:

Mockito.verify(mock, Mockito.never()).someFunctionCall(Matchers.<String>any());
doSomething(mock);
Mockito.verify(mock, Mockito.times(1)).someFunctionCall(Matchers.<String>any());
doSomethingElse(mock);

这对应于验证doSomething 从不调用someFunctionCall,而是被doSomethingElse 调用一次。

我如何用 GMock 完成同样的事情?

EXPECT_CALL(mock, someFunctionCall(_)).Times(0);
doSomething(mock);
EXPECT_CALL(mock, someFunctionCall(_)).Times(1);
doSomethingElse(mock);

由于期望堆栈,显然不起作用。

【问题讨论】:

    标签: c++ unit-testing mockito gmock


    【解决方案1】:

    Mock::VerifyAndClearExpectations / Mock::VerifyAndClear 可用于这些目的。

    【讨论】:

      【解决方案2】:

      对于类似的事情,您可能想要设置两个不同的测试。一种用于doSomething,另一种用于doSomethingElse。或者,如果第二个的行为取决于第一个,您可以执行以下操作:

      {
        MyMock mock;
        EXPECT_CALL(mock, someFunctionCall(_)).Times(0);
        doSomething(mock);
      }
      {
        MyMock mock;
        EXPECT_CALL(mock, someFunctionCall(_)).Times(1);
        doSomethingElse(mock);
      }
      

      断言的验证是在对象销毁时完成的,因此将每个模拟的范围限定为它需要的调用集将验证断言。但实际上,我可能会尝试将这两种方法的测试分成单独的测试。如果您有不想重复的样板设置,请将其粘贴在您的 TEST_Fs 派生自的基类中。

      【讨论】:

      • 考虑到周围的情况,这两种情况都不可行。
      • 是否可以围绕代码共享更多上下文 - 提供更多信息的答案会更容易,尽管我看到你发现了一些有用的东西。需要如何调用方法之间存在一些紧密耦合的事实使我认为一般设计的某些内容并不像应有的那样清晰。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多