ich bereits nach einer Lösung für Mock Vermächtnis c-Funktionen mit googleMock ohne Änderung der bestehenden Code und letzten Tage eine lange Zeit war auf der Suche ich folgendes wirklich großen Artikel gefunden: https://www.codeproject.com/articles/1040972/using-googletest-and-googlemock-frameworks-for-emb
Heute habe ich für meine erste Einheit Test geschrieben c-Funktionen mit gmock und nahm als Beispiel zwei Funktionen aus der Bibliothek bcm2835.c (http://www.airspayce.com/mikem/bcm2835/) für Raspberry Pi Programmierung: Hier ist meine Lösung: Ich benutze die gcc 4.8.3. unter Eclipse und Windows. Achten Sie darauf, die Compiler-Option -std = gnu ++ 11 festzulegen.
Hier sind meine Funktionen
int inits(void);
void pinMode(uint8_t pin, uint8_t mode);
int inits(){
return bcm2835_init();
}
void pinMode(uint8_t pin, uint8_t mode){
bcm2835_gpio_fsel(pin, mode);
}
Inklusive und für Unit-Tests definiert mit googleTest/googleMock
// MOCKING C-Functions with GMOCK :)
#include <memory>
#include "gtest/gtest.h"
#include "gmock/gmock.h"
using namespace ::testing;
using ::testing::Return;
Funktionen Mock BCM2835Lib
class BCM2835Lib_MOCK{
public:
virtual ~BCM2835Lib_MOCK(){}
// mock methods
MOCK_METHOD0(bcm2835_init,int());
MOCK_METHOD2(bcm2835_gpio_fsel,void(uint8_t,uint8_t));
};
getestet werden
erstellen TestFixture
class TestFixture: public ::testing::Test{
public:
TestFixture(){
_bcm2835libMock.reset(new ::testing::NiceMock<BCM2835Lib_MOCK>());
}
~TestFixture(){
_bcm2835libMock.reset();
}
virtual void SetUp(){}
virtual void TearDown(){}
// pointer for accessing mocked library
static std::unique_ptr<BCM2835Lib_MOCK> _bcm2835libMock;
};
Instantiate verspottet lib Funktionen
// instantiate mocked lib
std::unique_ptr<BCM2835Lib_MOCK> TestFixture::_bcm2835libMock;
Gefälschte lib Funktionen Mocks verbinden mit den c-Funktionen
// fake lib functions
int bcm2835_init(){return TestFixture::_bcm2835libMock->bcm2835_init();}
void bcm2835_gpio_fsel(uint8_t pin, uint8_t mode){TestFixture::_bcm2835libMock->bcm2835_gpio_fsel(pin,mode);}
erstellen Unit-Test-Klasse für BCM2835 von TestFixture
// create unit testing class for BCM2835 from TestFixture
class BCM2835LibUnitTest : public TestFixture{
public:
BCM2835LibUnitTest(){
// here you can put some initializations
}
};
die Tests schreiben googleTest und googleMock
TEST_F(BCM2835LibUnitTest,inits){
EXPECT_CALL(*_bcm2835libMock,bcm2835_init()).Times(1).WillOnce(Return(1));
EXPECT_EQ(1,inits()) << "init must return 1";
}
TEST_F(BCM2835LibUnitTest,pinModeTest){
EXPECT_CALL(*_bcm2835libMock,bcm2835_gpio_fsel((uint8_t)RPI_V2_GPIO_P1_18
,(uint8_t)BCM2835_GPIO_FSEL_OUTP
)
)
.Times(1)
;
pinMode((uint8_t)RPI_V2_GPIO_P1_18,(uint8_t)BCM2835_GPIO_FSEL_OUTP);
}
Ergebnisse :)
[----------] 2 tests from BCM2835LibUnitTest
[ RUN ] BCM2835LibUnitTest.inits
[ OK ] BCM2835LibUnitTest.inits (0 ms)
[ RUN ] BCM2835LibUnitTest.pinModeTest
[ OK ] BCM2835LibUnitTest.pinModeTest (0 ms)
[----------] 2 tests from BCM2835LibUnitTest (0 ms total)
Hoffe, es wird dazu beitragen, mit:) - für mich ist das eine wirklich funktionierende Lösung.
Ist 'func_1()' auch eine 'C'-Funktion? –
@OldFox Ja, es ist eine C-Funktion. – user3159610
Ist 'func_1()' ein komplexes Szenario oder verwenden Sie eine nicht testbare Abhängigkeit (zB Hardware) –