Turtle Mock: MOCK_EXPECT завершается ошибкой, если метод mocked класса возвращает значение

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

Я пишу приложение для C ++ Boost для Linux (Virtualized Ubuntu 16.04 amd_64) и использую Turtle Mock для среды моделирования и Boost Test для среды тестирования. Когда я пытаюсь протестировать класс, который использует технику внедрения зависимостей, я высмеиваю классы, которые нужно передать классу тестирования, чтобы я мог проверить последовательность их вызова. Пока все хорошо, но проблема здесь.
Я использую MOCK_BASE_CLASS (MockAClass, AClass), чтобы переопределить виртуальные методы реального AClass, и использую новый MockAClass для продолжения моих тестов. Допустим, в AClass есть виртуальный метод int getTest (int), а в MockAClass — MOCK_METHOD (getTest, 1, int (int)) после установки ожидания и возвращаемого значения для метода getTest объекта MockAClass и вызова метода, ожидание которого в большинстве случаев MOCK_EXPECT (objMockAClass.getTest) .at_least (1) НИКОГДА не проверяется. Я могу контролировать возвращаемое значение, но вызов никогда не проверяется, как это произошло. Это происходит только в том случае, если функция возвращает значение (например, если функция void getTest (int), тогда проверка пройдет).

Я прилагаю простой PoC моей проблемы, которая не сработает в моей системе.

class AClass
{
public:
virtual int getTest(int a) {return 0}
}

MOCK_BASE_CLASS (MockAClass, AClass)
{
MOCK_METHOD(getTest, 1, int(int));
}

BOOST_AUTО_TEST_CASE(SomeClassFunctionality)
{

MockAClass  objMockAClass;

MOCK_EXPECT(objMockAClass.getTest).returns(1);
MOCK_EXPECT(objMockAClass.getTest).at_least(1);
objMockAClass.getTest(1);

}

1

Решение

MOCK_EXPECT(objMockAClass.getTest).returns(1);
MOCK_EXPECT(objMockAClass.getTest).at_least(1);

Это на самом деле два ожидания. Первый из них означает «каждый раз, когда getTest вызывается return 1», а второй «getTest должен вызываться как минимум один раз».
Проблема в том, что первый всегда будет совпадать, поэтому у второго не будет возможности сработать.

0

Другие решения

Проблема решается, если отдельные операторы EXPECT объединяются в один оператор EXPECT.

MOCK_EXPECT(objMockAClass.getTest).at_least(1).returns(1); — Это заставит пример работать как запланировано.

С Уважением,

0

По вопросам рекламы [email protected]