使用海龟模拟来模拟对象以进行 boost::test

Posted

技术标签:

【中文标题】使用海龟模拟来模拟对象以进行 boost::test【英文标题】:Mock object with turtle mock for boost::test 【发布时间】:2018-01-18 17:07:20 【问题描述】:

我正在尝试使用 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 )

计算器.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

计算器.cpp:

#include "Calculator.h"

Calculator::Calculator(View& v)
: view(v) 

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

查看.h:

#ifndef VIEW_H
#define VIEW_H

class View 
public:
    View() = default;

    void display(int a);
;

#endif //VIEW_H

查看.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;

我错过了什么?我的测试问题出在哪里?

【问题讨论】:

是的,就是这样。我忘了virtual 【参考方案1】:

您的模拟对象是View 的子类,它定义了display。但是因为display 没有在View 中声明virtual,所以基类版本是从单元测试而不是模拟版本中调用的。您可以观察到这一点,因为Display: 0 存在于单元测试的输出中。将View::display 定义为virtual 即可。

【讨论】:

以上是关于使用海龟模拟来模拟对象以进行 boost::test的主要内容,如果未能解决你的问题,请参考以下文章

在乌龟模拟中模拟数组的元素

使用Prism 7.1,x在UnityContainer中注册模拟对象以进行单元测试

如何使用 Mockito 模拟由 Spring 应用程序上下文创建的对象以进行单元测试覆盖?

urllib中的保存cookie使用,运用cookiejar来模拟登录人人网

使用补丁模拟两个函数以进行单元测试

如何模拟JPA Repository以使用它与Junit进行测试?