![](/img/trans.png)
[英]Using 3rd Party Shared Object Library and header files in CMake
[英]Mocking an 3rd party library using fakeit
我正在編寫我自己的庫/類,它使用了 3rd 方庫。 我想為我自己的類編寫測試,並模擬 3rd 方庫。 在其中一個測試中,我想確保當我的類上的一個函數被調用時,第 3 方庫中的另一個函數也開始被調用。 我認為FakeIt 庫是測試這個的好主意。
這是我的測試代碼示例:
#include "MyTest.h"
#include "fakeit.hpp"
using namespace fakeit;
int main() {
MyTest dt;
Mock<ExternLib> mock;
Fake(Method(mock, someFunc));
ExternLib& el = mock.get();
dt.begin();
Verify(Method(mock, someFunc));
return 0;
}
但是,當它運行時,它會拋出一個fakeit::SequenceVerificationException
與
Expected pattern: mock.someFunc( Any arguments )
Expected matches: at least 1
Actual matches : 0
Actual sequence : total of 0 actual invocations.
很明顯,模擬不起作用,它的方法沒有被調用。 知道如何模擬這個類並驗證它的方法被調用了嗎?
MyTest.cpp 只是一個簡單的測試,將是我的完整庫/類:
#include "MyTest.h"
MyTest::MyTest() {
_manager = new ExternLib();
}
void MyTest::begin() {
result = _manager->someFunc();
}
它是頭文件:
#pragma once
#include "Externlib.h"
class MyTest {
public:
MyTest();
virtual void begin();
int result = 3;
private:
ExternLib *_manager;
};
ExternLib 是第 3 方庫的模擬版本。 我的實現實現了真實接口的基本要求,而函數實際上沒有做任何事情。 實現實際上只是為了滿足#include Externlib.h
語句。
這是我的 Externlib.cpp:
#include "Externlib.h"
ExternLib:: ExternLib() {}
int ExternLib::someFunc() {
return 5;
}
和頭文件:
#pragma once
class ExternLib {
public:
ExternLib();
virtual int someFunc();
};
解釋fakeit::SequenceVerificationException
:使用Mock<ExternLib> mock;
您創建了一個ExternLib
的新實例,它永遠不會被MyTest
調用(因為MyTest
創建了它自己的ExternLib
實例)。 要測試調用,您可以
_manager
的 ExternLib 實例暴露給您的測試,然后監視它( Mock<ExternLib> mock(MyTest._manager);
或類似的)MyTest::_manager
中的 ExternLib 實例與您的 ExternLib Mock 實例交換。但這意味着為了可測試而暴露您的受測對象的內部運作,這可能是不希望的。
但是,我以前從未使用過偽造它,當您在將 MyTest 注入后將 mock.get() 傳遞給 MyTest 時,它可能會起作用。
class MyTest {
public:
MyTest(ExternaLib* lib) : _manager(lib) {}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.