Sto scrivendo alcune unità di test usando googletest e googlemock e sono bloccato in un problema relativo ai puntatori e al polimorfismo di C ++ 11.
Supponi di avere queste classi:
class A {
public:
virtual void doThings() {...};
};
class B {
private:
B(std::unique_ptr<A> a): a_(std::move(a)) {}
std::unique_ptr<A> a_;
};
Voglio testare la classe B
e quindi creo un mock per A
e lo passo nel costruttore:
class MockA: public A {
public:
virtual ~MockA() {}
MOCK_METHOD0(doThings, void());
};
TEST(...) {
auto ma = std::make_unique<MockA>();
B b(std::move(ma));
// Set expectation on mock
// call B method
}
Il problema è questo:
- il mock è stato spostato all'interno dell'istanza
B
e quindi la verifica delle aspettative genera un'eccezione perchéma
è nullo.
Il mio primo tentativo di risolverlo è stato quello di modificare B
come segue:
class B {
private:
B(std::unique_ptr<A>& a): a_(a) {}
std::unique_ptr<A>& a_;
};
Ora B
gestisce il puntatore univoco riferimenti e non usa std::move
. Anche il test è cambiato (non più uso di std::move
):
TEST(...) {
auto ma = std::make_unique<MockA>();
B b(ma);
// Set expectation on mock
// call B method
}
Ora il codice non viene compilato perché i riferimenti (se ho capito correttamente l'errore) non sono polimorfici (il puntatore univoco di MockA
non può essere convertito nel puntatore univoco di A
).
Mi mancano alcune nozioni di base sui puntatori intelligenti? O è questo il comportamento previsto con i puntatori unici e quindi devo ripensare alle mie classi (magari usando i puntatori condivisi)?