2017-06-19 4 views
1

J'ai implémenté une classe en utilisant un modèle de conception de politique et j'ai besoin de la tester en utilisant googletest/googlemock. Par exemple. dans le code ci-dessous, je veux tester class Foo et voudrais utiliser une classe de simulation pour class Bar. Est-il possible de le tester en utilisant google test framework?Comment utiliser la classe maquette (GoogleMock) comme paramètre de modèle

template <typename T> 
class Foo : private T { 
public: 
    void foo() { 
    T::bar(); 
    } 
}; 

class Bar { 
public: 
    void bar() { 
    std::cout << "Hey there!" << std::endl; 
    } 
}; 

int main() { 
    Foo<Bar> f; 
    f.foo(); 
} 

Répondre

0

Vous pouvez utiliser gmock pour tester des modèles. Mais, puisque dans un tel scénario, vous n'avez pas d'accès "direct" à l'objet fantaisie, vous devez implémenter cet accès par vous-même - par exemple. à l'utilisation de la variable membre statique de classe Mock - voir:

class BarMock 
{ 
public: 
    // mocked method 
    MOCK_METHOD0(bar, void()); 

    // code below is needed to keep track of created mock objects: 
    BarMock() { prevIntance = lastInstance; lastInstance = this; } 
    ~BarMock() { lastInstance = prevIntance; } 

    BarMock* prevIntance; 
    static BarMock* lastInstance; 
}; 
BarMock* BarMock::lastInstance = nullptr; 

Ensuite, vous pouvez tester de cette façon:

Foo<BarMock> objectUnderTest; 
EXPECT_CALL(*BarMock::lastInstance, bar()); 
objectUnderTest.foo(); 
0

Il est impossible de le tester, parce que l'argument de modèle est une base privée de la classe de modèle Foo.

Si vous décidez de donner accès à sa classe de base (changer l'héritage en public, ou à partir d'une méthode), alors c'est assez simple: il suffit de créer une classe fictive et de l'utiliser comme paramètre template.

class BarMock 
{ 
    MOCK_METHOD0(bar, void()); 
}; 

Pour tester:

class TestFoo : public Test 
{ 
public: 
    TestFoo() : 
     mock(), 
     m(mock) 
    { 
    } 

    Foo<BarMock> mock; 
    BarMock& m; 
}; 

TEST_F(TestFoo, test_m) 
{ 
    EXPECT_CALL(m, bar()).Times(1); 

    mock.foo(); 
}