Tempo de leitura: menos de 1 minuto
Esta semana precisei criar um teste de um método que recebe um objeto por parâmetro. O problema era que eu tinha apenas um Map inicializado contendo todos os atributos e valores que precisava no objeto.
Lembrei então que o Groovy podia me ajudar nisto já que ele pode construir um objeto a partir de um mapa, desta forma:
[code language=”groovy”]
class Pessoa {
Integer idade
String nome
}
// 1) passando o mapa por parâmetro
def p1 = new Pessoa([idade: 36, nome: ‘Eder’])
assert 36 == p1.idade
assert ‘Eder’ == p1.nome
// 2) Explicitamente
def p2 = [idade: 36, nome: ‘Eder’] as Pessoa
assert 36 == p2.idade
assert ‘Eder’ == p2.nome
// 3) Implicitamente
Pessoa p3 = [idade: 36, nome: ‘Eder’]
assert 36 == p3.idade
assert ‘Eder’ == p3.nome
[/code]
Nota: Para usar em testes, esta forma de construir um objeto é muito legal, simples e fácil de fazer.
Só que apenas isso não era o suficiente. Eu também não tinha a classe (objeto), tinha apenas o full qualified name da classe, então não tinha com dar um new na classe ou usar outra forma de construição citado a cima.
Então, abri o Groovy web console e fiz alguns teste. Para minha surpresa fiz este teste e funcionou:
[code language=”groovy”]
class Pessoa {
Integer idade
String nome
}
def p1 = Class.forName(‘Pessoa’).newInstance([idade: 36, nome: ‘Eder’])
assert 36 == p1.idade
assert ‘Eder’ == p1.nome
[/code]
Basicamente, usei a reflexão do Java para criar o objeto através do full qualified name da classe Pessoa (no exemplo a cima, o full qualified name é “Pessoa”), e ao chamar o método newInstance, passei por parâmetro o Map. Não é que funcionou!! 🙂
Espero que possa ajuda-los
