Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web servers, web development, networking and security services. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

Mock Objekti za C++


Sta je mockpp


mockpp predstavlja platformu koja je nezavisna genericka jedinica i koristi se kao okvir za testiranje C++. Svrha ove platforme je da olaksa stvaranje jedinicnih testova u skladu sa Mock Objects for Java , EasyMock i jMock .

Mock objekti omogucavaju da postavite ponasanje koje se moze pretpostaviti kako bi ste mogli da testirate Vas kod proizvodnje tako sto ce ti objekti oponasati neke od funkcija od kojih zavisi kod. To, na primer, moze biti velika baza podataka koja je prezahtevna i oduzima previse vremena da bi je odrzavali zbog testiranja.

Prvo sam poceo sa portom Mock Objects do C++ i zeleo sam da zadrzim isti medjusklop. Ali u medjuvremenu sam otkrio vise o Java i i o razlikama izmedju Java i C++ (npr. to je funny reflection api) tako da sam morao da promenim mnogo detalja. Pored svega ovoga, ukljucio sam i EasyMock i jMock metode rada je EasyMock je laksi za koriscenje i zasigurno je bilo lakse prikljucitiga na C++. Moje ograniceno razumevanje Java ukazuje mi na postojanje necega sto bi bilo slicno MockObjects ali ja pretpostavljam da je EasyMock laksi za koriscenje i zasigurno je bilo lakse prikljuciti ga na C++.

Kako koristiti ovu biblioteku


Napomena: naredni delovi opisuju samo osnovne elemente u okviru mockpp. Takodje postoji i prirucnik , i api referenca kao i vodic koji je dostupan, a koji opbjasnjavaju razlicite delove mockpp.

Mockpp sadrzi klase, templejte (i makroe) koje sam ja podelio na Osnovna Ocekivanja i Veca Ocekivanja .

Osnovna ocekivanja


Osnovna ocekivanja pokrivaju jednostavne radnje. Vi kreirate objekat i govorite mu sta je dozvoljeno. Pa tako, ako zelite da proverite da li je metod prosao ispravne vrednosne parametre mozete postaviti mock objekat u odgovarajucu metodu kao sto je ova:


   ...

   void MyMockClass::initExpectation()
   {
     myIntExpectation.setExpected(123);
   }

   ....

   void MyMockClass::methodUnderTest(unsigned i)
   {
     myIntExpectation.setActual(i);
   }

  

Ukoliko je prolazna vrednost 123 kao sto je i ocekivano, sve je u redu. U suprotnom, pojavljuje se AssertionFailedError.

Postoji nekoliko klasa koje verifikuju jednostavna ocekivanja: Ponekad ne zelite da proveravate nastupajuce parametre ovom metodom, ali su Vam kao ishod potrebni predvidivi objekti. U ovom slucaju postavljate listu sa povratnim objektima:


   ...

   void MyMockClass::initReturnList()
   {
     myStringReturnList.addObjectToReturn(std::string("alice"));
     myStringReturnList.addObjectToReturn(std::string("bob"));
     myStringReturnList.addObjectToReturn(std::string("sue"));
   }

   ....

   std::string MyMockClass::methodUnderTest()
   {
     return myStringReturnList.nextReturnObject();
   }

  

Jedan objekat nakon drugog vracaju se po datom redosledu. Ukoliko ste odjednom zahtevali previse objekata pojavljuje se AssertionfailedError. Isto se desava i ukoiliko ne odgovorite svim objektima.

Za vise informacija pogledajte pocetni deo uputstva.

Veca ocekivanja


mockpp trenutno podrzava dva razlicita pristupa kod kreiranja mock objekata. Prvi pristup je laksi za razumevanje, ali je i krucii. Drugi pristup je kompleksniji, ali daje mnogo vise fleksibilnosti i prilagodjava se definisanim klasama korisnika. Odabir pristupa je individualna stvar. Postoji poglavlje koje predstavlja zajednicke karakteristike .

Visitable Mock Objects


Osnovna ideja je da se zameni Vas stvarni objekat sa objektom koji simulira ograniceno ponasanje. U svrhu toga Vi kreirate VisitableMockObject i ostale propratne metode. Kao dodatak ovome Vi snimate execution path i dajete mu odredjene parametre. Neki objekti trebaju biti vraceni ili zadajete komandu da izuzeci budu izbaceni. Svi vraceni objekti i izuzeci takodje mogu uslovno biti bazirani na parametrima koji su prosledjeni Vasem metodu.

Da biste lako ubacili ocekivane parametre u Vase pozive potrebna Vam je mock metoda za Vas mock objekat.


    class MyVisitableMockObject : public VisitableMockObject
    {
    public:

        MyVisitableMockObject(const String &name)
          : VisitableMockObject(name, 0)
          // constructs an internal mock method
          , visitable_mocker("visitable") this)
        {}

        // forwards the actual call to the mock method
        int visitable(unsigned u)
        {
          return visitable_mocker.forward(u);
        }

        // creates a mock method for: int visitable(unsigned);
        VisitableMockMethod<int, unsigned>  visitable_mocker;
    };

    ....

    MyVisitableMockObject mvo("mvo");

    // create a short hand reference to the mock method
    VisitableMockMethod<int, unsigned> &visitor (mvo.visit_mocker);

    // we are in record mode now:

    visitor.addReturnValue(1);                // return "1" the first time
    visitor.addReturnValue(11);               // return "11" the second time
    visitor.setDefaultReturnValue(123);       // return "123" all the other calls

    visitor.addResponseValue(0, 1);           // return "0" when passed "1"
    visitor.addResponseValue(1, 0);           // return "1" when passed "0"

    visitor.addResponseThrowable(make_throwable(int(1), 1);  // throw when passed "1"
    visitor.addResponseThrowable(make_throwable(int(0), 0);  // throw when passed "0"

    // throw std::string("string 1") when called the first time
    visitor.addThrowable(make_throwable(std::string("string 1")));

    // throw std::string("string 2") the next three times
    visitor.addThrowable(std::string("string 2"), 3);

    // throw int(123) the rest of the time
    visitor.setDefaultThrowable(make_throwable(int(123)));

    mvo.visitable(1);       // require "1" as parameter the first time
    mvo.visitable(2);       // require "2" as parameter the second time

    mvo.activate()

    // from now on all calls are verified

    mvo.visitable(1);       // verify "1" which is ok, see above
    mvo.visitable(1);       // would fail as "2" is required

    ....
  

Za vise informacija pogledajte deo visitable mock objects u uputstvu.

Chainable Mock Objekti


Ukoliko neko ponasanje definisemo pomocu drugog pristupa koji se zove chainable mock objekti i veoma je slican onome kako ga opisujemo recima. na primer, mozete reci: U C++ kodu isto mozete ovako izraziti:


    chainer.expects(once())
           .after("other-ident")
           .with(new IsEqual<int>(321))
           .will(new ReturnStub(123))
           .id("ident");

    

Slicno gore pomenutom pristupu morate kreirati objekat pomagac da biste izrazili Vasa ocekivanja. Ovo je dalje objasnjeno u delu chainable mock objects u prirucniku.

Poor Man's Mock Objects


Vecinu vremena nece Vam biti potrebna kompletna biblioteka mock objekata. Cesto su dovoljne jednostavne linije kodova sa brzim i grubim pristupom. Iz tog razloga prirucnik sadrzi simple mock object patterns kome nije potrebna dodatna podrska iz biblioteke.

Ukoliko znate neke druge nacine, licno ja bih voleo da mi ih posaljete kako bi ih uvrstio u ovaj prirucnik.



Published (Last edited): 18-12-2012 , source: http://mockpp.sourceforge.net/index-en.html