Я долгое время скрывался в совете директоров, и нет нужды говорить, что вы, ребята, лучшие, и я благодарен за все то время, когда вы спасли мою работу. Это мой первый пост здесь, и я надеюсь, что не испортил его.
Я пишу приложение для 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);
}
MOCK_EXPECT(objMockAClass.getTest).returns(1);
MOCK_EXPECT(objMockAClass.getTest).at_least(1);
Это на самом деле два ожидания. Первый из них означает «каждый раз, когда getTest вызывается return 1», а второй «getTest должен вызываться как минимум один раз».
Проблема в том, что первый всегда будет совпадать, поэтому у второго не будет возможности сработать.
Проблема решается, если отдельные операторы EXPECT объединяются в один оператор EXPECT.
MOCK_EXPECT(objMockAClass.getTest).at_least(1).returns(1);
— Это заставит пример работать как запланировано.
С Уважением,