2015-07-31 3 views
0

В GMock можно заменить ранее установленное ожидание?GMock: переопределение ожидания по умолчанию

Предположит, тест люкс ожидание по умолчанию для конкретного вызова метода, который является то, что в большинстве случаев тестов хотят:

class MyClass { 
public: 
    virtual int foo() = 0; 
}; 

class MyMock { 
public: 
    MOCK_METHOD0(foo, int()); 
}; 

class MyTest: public Test { 
protected: 
    void SetUp() { 
     EXPECT_CALL(m_mock, foo()).WillOnce(Return(1)); 
    } 
    MyMock m_mock; 
}; 

TEST_F(MyTest, myTestCaseA) { 
    EXPECT_EQ(1, m_mock.foo()); 
} 

Это работает нормально. Однако некоторые из тестовых примеров имеют разные ожидания. Если я добавлю новое ожидание, как показано ниже, это не сработает.

TEST_F(MyTest, myTestCaseB) { 
    EXPECT_CALL(m_mock, foo()).WillOnce(Return(2)); 
    EXPECT_EQ(2, m_mock.foo()); 
}; 

Я получаю сообщение:

[ RUN  ] MyTest.myTestCaseB 
/home/.../MyTest.cpp:94: Failure 
Actual function call count doesn't match EXPECT_CALL(m_mock, foo())... 
     Expected: to be called once 
      Actual: never called - unsatisfied and active 
[ FAILED ] MyTest.myTestCaseB (0 ms) 

Я понимаю, почему я получаю это. Вопрос в том, как отменить ожидаемое по умолчанию, если тестовый пример указывает его собственный? Разрешает ли GMock это или какие подходы я могу использовать для достижения намеченного поведения?

ответ

4

Нет, нет возможности устранить произвольное ожидание. Вы можете использовать VerifyAndClearExpectations, чтобы очистить от всех из них, это, вероятно, больше, чем вы хотите. Я могу думать о нескольких альтернатив, которые позволяют избежать вопроса:

  • Вы могли бы работать вокруг проблемы, просто позвонив m_mock.foo() раз заранее, таким образом, выполняя первоначальные ожидания.

    TEST_F(MyTest, myTestCaseB) { 
        EXPECT_CALL(m_mock, foo()).WillOnce(Return(2)); 
        (void)m_mock.foo(); 
        EXPECT_EQ(2, m_mock.foo()); 
    } 
    
  • Другой альтернативой является изменение ожидания, чтобы он возвращает значение переменной, а затем затем обновить переменную до пробного тела, как описано в книге рецептов под Returning Live Values from Mock Methods. Например:

    void SetUp() { 
        m_foo_value = 1; 
        EXPECT_CALL(m_mock, foo()).WillOnce(Return(ByRef(m_foo_value))); 
    } 
    
    TEST_F(MyTest, myTestCaseB) { 
        m_foo_value = 2; 
        EXPECT_EQ(2, m_mock.foo()); 
    } 
    
  • Еще одна альтернатива заключается в определении возвращаемого значения и счет отдельно.

    void SetUp() { 
        ON_CALL(m_mock, foo()).WillByDefault(Return(1)); 
        EXPECT_CALL(m_mock, foo()).Times(1); 
    } 
    

    Затем вам нужно только указать новое возвращаемое значение для специального теста:

    TEST_F(MyTest, myTestCaseB) { 
        ON_CALL(m_mock, foo()).WillByDefault(Return(2)); 
        EXPECT_EQ(2, m_mock.foo()); 
    } 
    
+0

Третий один велик! Спасибо! – Kane

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