我想测试一些代码,这些代码是为了在Visual Studio本机单元测试项目中的嵌入式处理器上运行而编写的。
TestMe类有几个很好的测试候选方法,但是Foo和Bar类直接访问内存映射寄存器,这些寄存器仅在嵌入式处理器上可用。
#pragma once
#include "Foo.h"
#include "Bar.h"
class TestMe
{
public:
TestMe(Foo& aFoo, Bar& aBar);
~TestMe();
float FooBar();
};模拟这些对象以便测试TestMe类的最佳方法是什么?
编辑:对我来说,最好的方法是尽可能少地干扰正在测试的软件。
发布于 2018-09-24 19:30:19
"Best“总是主观的,但我喜欢使用模板来进行这种模仿:
template <typename TFoo, typename TBar>
class TestMeImpl
{
public:
TestMeImpl(TFoo& aFoo, TBar& aBar);
~TestMeImpl();
float FooBar();
};
using TestMe = TestMeImpl<Foo, Bar>;您可以针对TestMeImpl编写单元测试,但将TestMe公开给用户。
发布于 2018-09-24 20:30:01
您的Foo和Bar通过引用传递给构造函数。有两种方法可以做到这一点。
我个人喜欢使用接口并利用多态对象。
所以看起来是这样的:
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());
}这基本上和模板的使用是一样的。在这种情况下,使用了动态多态性。在模板的情况下,你得到了类似的东西,所以有些人称它为静态多态性。
这两种方法各有优缺点,您可以决定哪种方法最适合您的情况。
发布于 2018-09-24 20:56:26
有一种解决方案,不引入接口仅用于测试目的(:链接时间替换。
规则:
Hpp文件:
#pragma once
#include <gmock/gmock.h>
class FooMock
{
FooMock();
~FooMock();
MOCK_METHOD0(foo, void());
};Cpp文件:
#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();
}缺点是它不适用于多线程测试。希望能有所帮助。
https://stackoverflow.com/questions/52478352
复制相似问题