2017-11-29 19 views
0

Ich habe eine Klasse sagen A wie unten erwähnt:Mock Methoden, die nicht virtuell sind

class A 
{ 
void show() 
{} 
int data(int x) 
{} 
..... 
}; 

ich die Klasse verspotten müssen - da die Mitgliederfunktionen nicht virtuell sind - kann ich meine mock Klasse wie entwerfen unten erwähnt :

class MockA : public A 
{ 
MOCK_METHIOD0(show, void()); 
MOCK_METHIOD1(data, int (int)); 
} 

Kann ich diese Art und Weise implementieren und ist es eine Chance von mocka Verspottung eine beliebige Funktion der Klasse zu verzichten? Objekte, die mit MockA erstellt wurden, werden jemals landen und die tatsächliche Methodenimplementierung der Klasse A aufrufen.

Antwort

0

Im Allgemeinen haben Sie in diesem Fall nicht die Pseudo-Erben von A und verwenden stattdessen einen Kompilierzeitmechanismus, um auszuwählen, ob eine Implementierungsklasse oder eine Scheinklasse verwendet werden soll. Z.B. Templating alles, was A verwendet und dann die Vorlagen mit entweder A oder MockA instanziieren, um die Produktionsklasse durch die Scheinklasse in der Testkonfiguration zu ersetzen. Alle Methoden, die nicht im Mock implementiert sind, aber aufgerufen werden, führen zu einem Kompilierzeitfehler. Die Verwendung der Makros in der Scheindefinition ist ziemlich gleich, obwohl die Methoden nicht virtuell sind.

Der schwierige Teil ersetzt die Klasse überall. Vorlagen, die über ein Makro auf den Klassennamen verweisen oder denselben Klassennamen verwenden und sicherstellen, dass nur einer verknüpft ist, sind alle Möglichkeiten.

+0

Wird obige Methode die tatsächliche Implementierung nicht überschreiben, wenn Objekte mit MockA erstellt werden? – Prakash

+0

Nicht sicher, was Sie meinen, "überschreiben Sie die tatsächliche Implementierung." Nicht-virtuelle Methoden werden namentlich verknüpft, so dass der Compiler entweder einen direkten Aufruf z. entweder 'A :: show' oder' MockA :: show'. Beachten Sie, dass selbst im Fall der virtuellen Methode der Mock nicht allgemein von einer Implementierung geerbt wird, sondern von einer Schnittstelle, von der die Implementierung auch erbt. –

Verwandte Themen