2016-10-06 1 views
1

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

Я пишу приложение 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); 

} 

ответ

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

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

+0

Да, это правильно. Он обрабатывает их как два отдельных взаимоисключающих утверждения, и именно поэтому он терпит неудачу. Спасибо за поддержку. :) –

0

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

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

С уважением,