Макет объекта с черепахой макет для повышения :: тест

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

$ ./unittest
Running 1 test case...
Start
Display: 0
End
Calculator.spec.cpp(16): error in "zero_plus_zero_is_zero": untriggered expectation: v.MockView::display
. once().with( 0 )

calculator.h:

#ifndef CALCULATOR_H
#define CALCULATOR_H

#include "View.h"
class Calculator {
public:
Calculator(View& v);

void add( int a, int b ); // the result will be sent to the view 'v'
private:
View& view;
};

#endif //CALCULATOR_H

Calculator.cpp:

#include "Calculator.h"
Calculator::Calculator(View& v)
: view(v) {}

void Calculator::add(int a, int b) {
view.display(a + b);
}

view.h:

#ifndef VIEW_H
#define VIEW_H

class View {
public:
View() = default;

void display(int a);
};

#endif //VIEW_H

view.cpp:

#include "View.h"#include <iostream>

void View::display(int a) {
std::cout << "Display: " << a << std::endl;
}

Calculator.spec.cpp:

#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MODULE calculator
#include "Calculator.h"#include "View.h"#include <turtle/mock.hpp>
#include <boost/test/unit_test.hpp>

MOCK_BASE_CLASS(MockView, View) {
MOCK_METHOD(display, 1)
};

BOOST_AUTO_TEST_CASE( zero_plus_zero_is_zero ) {
std::cout << "Start" << std::endl;
MockView v;
Calculator calculator(v);
MOCK_EXPECT(v.display).once().with(0);
calculator.add(0, 0);
std::cout << "End" << std::endl;
}

Makefile:

    test: Calculator.spec.cpp Calculator.cpp Calculator.h View.cpp View.h
g++ Calculator.spec.cpp Calculator.cpp View.cpp -o unittest --std=c++11 -lboost_unit_test_framework

Unittest не выдает ошибок, когда я изменяю тест на

BOOST_AUTO_TEST_CASE( zero_plus_zero_is_zero ) {
std::cout << "Start" << std::endl;
MockView v;
Calculator calculator(v);
MOCK_EXPECT(v.display).once().with(0);
//calculator.add(0, 0);
v.display(0);
std::cout << "End" << std::endl;
}

Что мне не хватает? Где проблема с моим тестом?

0

Решение

Ваш фиктивный объект является подклассом View и это определяет display, Но потому что display не объявлено virtual в Viewверсия базового класса вызывается из модульного теста вместо фиктивной версии. Вы можете наблюдать это, потому что Display: 0 присутствует на выходе модульного теста. определять View::display как virtual и это будет работать.

1

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

Других решений пока нет …

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