boost::test 的带有海龟模拟的模拟对象
Mock object with turtle mock for boost::test
我正在尝试使用 turtle 和 boost 创建一个包含模拟对象的单元测试。但是这个例子不起作用,我找不到错误。我预计没有错误,但结果是:
$ ./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;
}
生成文件:
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
当我将测试更改为
时,单元测试没有产生任何错误
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;
}
我想念什么?我的测试哪里出了问题?
您的模拟对象是 View
的子 class,它定义了 display
。但是因为 display
没有在 View
中声明 virtual
,所以从单元测试而不是模拟版本调用基本 class 版本。您可以观察到这一点,因为 Display: 0
出现在单元测试的输出中。将 View::display
定义为 virtual
即可。
我正在尝试使用 turtle 和 boost 创建一个包含模拟对象的单元测试。但是这个例子不起作用,我找不到错误。我预计没有错误,但结果是:
$ ./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;
}
生成文件:
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
当我将测试更改为
时,单元测试没有产生任何错误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;
}
我想念什么?我的测试哪里出了问题?
您的模拟对象是 View
的子 class,它定义了 display
。但是因为 display
没有在 View
中声明 virtual
,所以从单元测试而不是模拟版本调用基本 class 版本。您可以观察到这一点,因为 Display: 0
出现在单元测试的输出中。将 View::display
定义为 virtual
即可。