首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >被测类的模拟依赖关系

被测类的模拟依赖关系
EN

Stack Overflow用户
提问于 2018-09-24 19:27:25
回答 4查看 101关注 0票数 3

我想测试一些代码,这些代码是为了在Visual Studio本机单元测试项目中的嵌入式处理器上运行而编写的。

TestMe类有几个很好的测试候选方法,但是Foo和Bar类直接访问内存映射寄存器,这些寄存器仅在嵌入式处理器上可用。

代码语言:javascript
复制
#pragma once

#include "Foo.h"
#include "Bar.h"

class TestMe
{
public:
    TestMe(Foo& aFoo, Bar& aBar);
    ~TestMe();

    float FooBar();

};

模拟这些对象以便测试TestMe类的最佳方法是什么?

编辑:对我来说,最好的方法是尽可能少地干扰正在测试的软件。

EN

回答 4

Stack Overflow用户

发布于 2018-09-24 19:30:19

"Best“总是主观的,但我喜欢使用模板来进行这种模仿:

代码语言:javascript
复制
template <typename TFoo, typename TBar>
class TestMeImpl
{
public:
    TestMeImpl(TFoo& aFoo, TBar& aBar);
    ~TestMeImpl();

    float FooBar();
};

using TestMe = TestMeImpl<Foo, Bar>;

您可以针对TestMeImpl编写单元测试,但将TestMe公开给用户。

票数 4
EN

Stack Overflow用户

发布于 2018-09-24 20:30:01

您的FooBar通过引用传递给构造函数。有两种方法可以做到这一点。

我个人喜欢使用接口并利用多态对象。

所以看起来是这样的:

代码语言:javascript
复制
class IFoo {
public:
     virtual void someFunction() = 0;
};

class IBar {
public:
     virtual void otherFunction() = 0;
};

class Foo : public IFoo {
    ....
    void someFunction() {
    }
};

class Bar : public IBar {
     .....
     void otherFunction() {
     }  
};

class TestMe {
public:
    TestMe(IFoo& aFoo, IBar& aBar);
    ~TestMe();

    float FooBar();
};

// test code (GMock example):
class MockFoo : public IFoo {
    MOCK_METHOD(someFunction(), void());
};

class MockBar : public IBar {
     MOCK_METHOD(otherFunction(), void());
};

TEST(TestMeTest, someTest)
{
   MockBar bar;
   MockFoo foo; 
   TestMe testMe(bar, foo);

   EXPECT_CALL(bar, otherFunction());

   EXPECT_EQ(0.2, testMe.FooBar());
}

这基本上和模板的使用是一样的。在这种情况下,使用了动态多态性。在模板的情况下,你得到了类似的东西,所以有些人称它为静态多态性。

这两种方法各有优缺点,您可以决定哪种方法最适合您的情况。

票数 0
EN

Stack Overflow用户

发布于 2018-09-24 20:56:26

有一种解决方案,不引入接口仅用于测试目的(:链接时间替换。

规则:

  • Foo和Bar在一个静态库中( Foo和Bar可以有单独的库)
  • 不要将这些库链接到测试执行。
  • 创建将链接到测试执行的模拟实现:

Hpp文件:

代码语言:javascript
复制
#pragma once
#include <gmock/gmock.h>

class FooMock
{
    FooMock();
    ~FooMock();

    MOCK_METHOD0(foo, void());
};

Cpp文件:

代码语言:javascript
复制
#include "Foo.hpp"
#include "FooMock.hpp"

namespace
{
    FooMock* fooMock;
}

FooMock::FooMock()
{
    assert(!fooMock);
    fooMock = this;
}

FooMock::~FooMock()
{
    fooMock = nullptr;
}

// Implement real Foo::foo
void Foo::foo()
{
    // call FooMock::foo
    fooMock->foo();
}

缺点是它不适用于多线程测试。希望能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52478352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档