2015-10-26 5 views
8

В Mockito мы можем указать несколько возвращается как (из here):Как указать последовательные возвращения в gmock?

//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.

ответ

9

ON_CALL больше используется для настройки поведения по умолчанию для функции. То есть вы знаете, что в тестируемом коде вызывается функция mocked, вы хотите установить какое-то значение по умолчанию, но на самом деле не важно, сколько раз вызывается функция.

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 - вы уже предоставили несколько примеров в вопросе, просто чтобы показать больше - пример, когда вы ожидаете 1, 2 то всегда 3:

EXPECT_CALL(foo, Sign(_)) 
     .WillOnce(Return(1)) 
     .WillOnce(Return(2)) 
     .WillRepeatedly(Return(3)); 

EXPECT_CALL «путь» может быть трудным, если вы хотите, чтобы установить это в испытательном стенде SetUp - и некоторые тесты м ight звоните 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()); 

} 
+1

Мое понимание ожиданий что они - то, что мы ожидаем вернуть, а не то, что на самом деле должно быть возвращено макетом. Это неправильно? Пример 'IncrementDummy' действительно полезен. Kinda сосет, что лучший способ определить несколько возвратов настолько вовлечен. :( –

+2

Если я правильно вас понимаю - тогда да. Мой пример очень искусственный - мы никогда не проверяем утверждением, что возвращает mocks - я просто пишу этот тест, чтобы показать, что этот механизм работает. Более общий мы можем сказать, что 'EXPECT_CALL'is для случаи, когда мы ожидаем, что вызванная функция вызвана из проверенного кода. Нет необходимости устанавливать «возвращаемое значение» - например, довольно часто мы ожидаем, что функция void будет вызвана .... – PiotrNycz

Смежные вопросы