2016-03-04 1 views
1

J'ai un test qui est quelque chose comme ceci:GMock - comment rafraîchir les valeurs de retour fictif?

#include <gmock/gmock.h> 

using namespace ::testing; 

class IMyInterface 
{ 
public: 
    virtual ~IMyInterface() = default; 
    virtual void* DoAllocate(size_t size) = 0; 
}; 

class MockMyInterface : public IMyInterface 
{ 
public: 
    MOCK_METHOD1(DoAllocate, void*(size_t)); 
}; 

class InterfaceUser 
{ 
public: 
    void DoIt(IMyInterface& iface) 
    { 
     void* ptr = iface.DoAllocate(1024); 
     free(ptr); 
     ptr = iface.DoAllocate(1024); 
     free(ptr); 
    } 
}; 

TEST(MyTest, AllocateMock) 
{ 
    MockMyInterface mockIFace; 

    EXPECT_CALL(mockIFace, DoAllocate(1024)).WillRepeatedly(Return(malloc(1024))); 

    InterfaceUser user; 
    user.DoIt(mockIFace); 
} 

int main(int numArgs, char** args) 
{ 
    ::testing::InitGoogleMock(&numArgs, args); 
    return RUN_ALL_TESTS(); 
} 

Cela se bloque parce que le code « réel » qui est en cours d'appels testé DoAllocate avec 1024 deux fois. Mais gmock semble faire seulement:

Return(malloc(1024)) 

Une fois même si elle est appelée deux fois. Evidemment c'est un problème car cela signifie que malloc est appelé une fois avec 1024 et que le "vrai" code libère deux fois le même pointeur. Comment puis-je forcer gmock à exécuter le malloc(1024) lors de chaque appel simulé?

Répondre

1

configuration vous attentes par des tampons pré-allocation, comme celui-ci:

void *buffer1 = malloc(1024); 
void *buffer2 = malloc(1024); 

EXPECT_CALL(mockIFace, DoAllocate(1024)).Times(2) 
    .WillOnce(Return(buffer1)) 
    .WillOnce(Return(buffer2)); 
+0

Merci - vous excitait l'appel malloc peut être en ligne dans le retour() de cette façon aussi :) – paulm

+0

@paulm Vous êtes les bienvenus! J'ai écrit la réponse à la hâte, et comme je n'étais pas sûr à 100% que si je pouvais utiliser 'Return' dans inline, j'ai plutôt utilisé des temporaires. :) –