在Mockito中,我们可以指定多个返回值,例如(取自here):

//you can set different behavior for consecutive method calls.
 //Last stubbing (e.g: thenReturn("foo")) determines the behavior of further consecutive calls.
 when(mock.someMethod("some arg"))
  .thenReturn(new RuntimeException())
  .thenReturn("foo");

 //There is a shorter way of consecutive stubbing:
 when(mock.someMethod()).thenReturn(1,2,3);
 when(mock.otherMethod()).thenThrow(exc1, exc2);

有没有一种方法可以为使用gmock制作的模拟指定多个返回值?目前我有:
store_mock_ = std::make_shared<StorageMock>();
ON_CALL(*store_mock_, getFileName(_)).Return("file1").Return("file2");

它无法编译,因为我无法在gmock中找出多个返回值。 gmock有可能吗?如果没有,还有其他方法可以解决此问题吗?我发现我们可以EXPECT多个返回值,例如:
using ::testing::Return;...
EXPECT_CALL(turtle, GetX())
    .WillOnce(Return(100))
    .WillOnce(Return(200))
    .WillOnce(Return(300));

但是,我还没有找到任何文档来模拟ON_CALL的多个返回。

最佳答案

ON_CALL更用于设置函数的默认行为。即您知道在被测试的代码中调用了模拟函数,您想要设置一些默认值,但是实际上调用函数多少次并不重要。

example:

  ON_CALL(foo, Sign(_))
      .WillByDefault(Return(-1));
  ON_CALL(foo, Sign(0))
      .WillByDefault(Return(0));
  ON_CALL(foo, Sign(Gt(0)))
      .WillByDefault(Return(1));

为了得到您想要的行为,我将使用expectations-您已经提供了一些有问题的示例,只是为了展示更多内容-当您期望12然后总是3时的示例:
  EXPECT_CALL(foo, Sign(_))
      .WillOnce(Return(1))
      .WillOnce(Return(2))
      .WillRepeatedly(Return(3));

当您想在测试装置EXPECT_CALL中设置SetUp“way”时可能会很麻烦-某些测试可能只调用一次foo。但是,当然,有一些方法可以“控制”后续调用的ON_CALL返回值-但您必须通过特殊的操作(例如获取某些函数的结果)来执行此示例中的示例:
class IDummy
{
public:
    virtual int foo() = 0;
};

class DummyMock : public IDummy
{
public:
    MOCK_METHOD0(foo, int());
};
using namespace ::testing;
class DummyTestSuite : public Test
{
protected:
    DummyMock dummy;
    void SetUp() override
    {
        ON_CALL(dummy, foo())
           .WillByDefault(
                 InvokeWithoutArgs(this, &DummyTestSuite::IncrementDummy));
    }
    int dummyValue = 0;
    int IncrementDummy()
    {
        return ++dummyValue;
    }

};


TEST_F(DummyTestSuite, aaa)
{
    ASSERT_EQ(1, dummy.foo());
    ASSERT_EQ(2, dummy.foo());
    ASSERT_EQ(3, dummy.foo());

}

关于c++ - 如何在gmock中指定连续 yield ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33355347/

10-12 23:52