Como a simulação a partir de modelos de métodos usando o Google Mock?
-
26-09-2019 - |
Pergunta
Eu estou tentando zombar de um modelo de método.
Aqui é a classe que contém o método de simulação :
class myClass
{
public:
virtual ~myClass() {}
template<typename T>
void myMethod(T param);
}
Como posso zombar do método myMethod usando o Google Mock?
Solução
Na versão anterior do Google Zombar você só pode simulação virtual de funções, consulte o documentação na página do projeto.
Versões mais recentes permitiu a simulação de não-métodos virtuais, usando o que eles chamam de hi-perf injeção de dependência.
Como congusbongus
estados:
O Google Simulação baseia-se na adição de variáveis de membro de suporte método de escárnio, e uma vez que não é possível criar o modelo de variáveis de membro, é impossível de simulação do modelo de funções
Uma solução alternativa, por Michael Harrington no googlegroups link de comentários, é fazer especializados os métodos de modelo que irá chamar uma função normal que pode ser zombado.Isso não resolver o caso geral, mas ele vai trabalhar para o teste.
struct Foo
{
MOCK_METHOD1(GetValueString, void(std::string& value));
template <typename ValueType>
void GetValue(ValueType& value);
template <>
void GetValue(std::string& value) {
GetValueString(value);
}
};
Outras dicas
Aqui está o post original novamente com comentários para ajudar na compreensão:
struct Foo
{
// Our own mocked method that the templated call will end up calling.
MOCK_METHOD3(GetNextValueStdString, void(const std::string& name, std::string& value, const unsigned int streamIndex));
// If we see any calls with these two parameter list types throw and error as its unexpected in the unit under test.
template< typename ValueType >
void GetNextValue( const std::string& name, ValueType& value, const unsigned int streamIndex )
{
throw "Unexpected call.";
}
template< typename ValueType >
void GetNextValue( const std::string& name, ValueType& value )
{
throw "Unexpected call.";
}
// These are the only two templated calls expected, notice the difference in the method parameter list. Anything outside
// of these two flavors is considerd an error.
template<>
void GetNextValue< std::string >( const std::string& name, std::string& value, const unsigned int streamIndex )
{
GetNextValueStdString( name, value, streamIndex );
}
template<>
void GetNextValue< std::string >( const std::string& name, std::string& value )
{
GetNextValue< std::string >( name, value, 0 );
}
};