2011-02-07 6 views
7

Sto provando a simulare un metodo virtuale con un identificatore throw(). La funzione originaria è simile al seguente:Mocking di un metodo con identificatore throw()

virtual ReturnValue FunctionName() const throw(); 

sto ottenendo l'errore del compilatore: looser throw specifier for 'virtual FunctionSignature'

Ecco il codice che ho provato finora:

MOCK_CONST_METHOD0(FunctionName, ReturnValue()); 
MOCK_CONST_METHOD0(FunctionName, ReturnValue() throw()); 
MOCK_CONST_METHOD0(FunctionName, ReturnValue()) throw(); // Gives a different error entirely. 

Ho provato quasi tutti i altra combinazione a cui riesco a pensare, ma questi sono quelli che sembrano più logici. Come faccio a fare in modo che Google deridi un metodo con un identificatore throw()?

+0

Mi sembra che Google codifica stile vieta eccezioni del tutto. –

+0

@Alexandre C: Quindi immagino che una domanda sia, GoogleMock è progettato per supportare il codice non scritto nello stile di casa di Google? –

+1

@Steve: la mia ipotesi è no (t ancora), ma non mi piace indovinare. –

risposta

1

Da quello che posso dire, che avrebbe dovuto usare la "interno" GMOCK_METHOD0_ macro, ed impiego:

GMOCK_METHOD0_(, const throw(), , FunctionName, ReturnValue) 

come MOCK_CONST_METHOD0(m, F) è #defineed a GMOCK_METHOD0_(, const, , m, F), gmock/gmock-generated-function-mockers.h#644 e gmock/gmock-generated-function-mockers.h#347 definisce quello.

+0

Fresco, ma ovviamente, lo svantaggio di questo è che potrebbe non funzionare in futuro (perché è interno). – StellarVortex

1

La mia soluzione: creare un'implementazione della funzione virtuale che consiste esclusivamente nel passare attraverso un metodo di simulazione.

MOCK_CONST_METHOD0(MockFunctionName, ReturnValue()); 
virtual ReturnValue FunctionName() const throw() 
{ 
    return MockFunctionName(); 
} 

Poi, ogni volta che è necessario scrivere un Expect_Call o fare qualsiasi cosa per quel metodo, basta fare riferimento a MockFunctionName.

+0

Ok, ora che ne dici di EXPECT_THROW – lolsborn

1

Google mock non supporta le specifiche delle eccezioni. Il motivo è che ritengono che le specifiche delle eccezioni siano per lo più una disfunzione e che dovrebbero essere evitate nella pratica, anche se si utilizza ampiamente le eccezioni .

ci sono alcune fonti che sostiene questo punto di vista:

la soluzione sarebbe riscrivere il codice come:

virtual ReturnValue FunctionName() const throw(); 

e quindi utilizzare:

MOCK_CONST_METHOD0(FunctionName, ReturnValue());