Alguns mocks que o grails(1.1) fornece:
1 - mockDomain(Clazz, list)
Injeta nas classes de domínio alguns métodos que só existem em tempo de execução, como por exemplo os métodos de validação, save()
, delete()
, etc.
O segundo parâmetro é opcional e serve como estado inicial do banco de dados. Internamente é feita uma cópia desta lista, que é usada como bootstrap para o banco de dados em memória que ele utiliza. A lista é usada pra dizer quais objetos serão considerados persistidos no banco de dados.
2 - mockFor(class, loose = false)
Obs: ao utilizar garantir que o mock não “vaze” para os outros testes, uma vez que o mock é feito alterando-se o meta-class do objeto.
Exemplo:
def strictControl = mockFor(MyService)
strictControl.demand.someMethod(0..2) { String arg1, int arg2 -> “”}
strictControl.demand.static.aStaticMethod {-> “” }
Métodos estáticos, bem como os de instância podem ser mocados simplesmente usando a propriedade static
depois de demand
. Em seguida, especifique o nome do método que você quer mockar com seu argumentos (opcionais). \
O intervalo informado após o nome do método determina quantas vezes você espera que o método será chamado, por isso, se o número de chamadas cai fora desta faixa (para menos ou para mais), então um assertion error será lançado. \
Se nenhum intervalo é especificado, um padrão de 1..1
é assumido, ou seja, espera-se que o método deve ser chamado exatamente uma vez.\
Para obter uma instancia do objeto em que o mock foi aplicado basta chamar o método createMock()
:\
Objeto meuObjeto = strictControl.createMock()
\
O createMock pode ser chamado quantas vezes for necessário.\
3 - mockForConstraintsTests(class, testInstances = )
Bastante semelhante ao mockDomain()
, porém mais especializada em testar apenas as restrições das classes de dominio. O mockDomain()
possui todas as opções que o mockForConstraintsTests
disponibiliza.
Basicamente insere métodos de validação do objeto de domínio.\
4 - mockLogging(class, enableDebug = false)
Mocka uma propriedade Log
a classe passada no parâmetro. As mensagens passadas para o Log são mostradas no console.\
5 - mockController(class)
Injeta alguns métodos no controller passado no parâmetro e geralmente é usado em conjunto com a classe ControllerUnitTestCase
.\
Para testar controladores basta extender a classe ControllerUnitTestCase
. Por exemplo: para testar o controller CadastroCompetenciaController
um teste deve ser criado seguindo o padrão de nomenclatura:
CadastroCompetenciaControllerTests extends ControllerUnitTestCase {...}
\
A classe ControllerUnitTestCase
possui um atributo chamado chamado controller
, que simula o controlador (o controlador é identificado por default pelo nome que demos à classe do nosso teste)
Para executar qualquer método do controller utilize: controller.meuMetodo()
\
Para que um método do controller receba os parametros desejados utilize:
mockParams.nomeParametro =valorParametro
controller.meuMetodo()
Isto garante que no meuMetodo()
o nomeParametro
estará disponível no params.
Há várias outras opções disponíveis para testar controladores. Mais alguns exemplos:\
redirectArgs
: pode ser usado para testar o redirecionamento de um método de um controller. possui 3 parâmetros: controller, action e model.\
mockResponse
: pode ser usado para testar a resposta de um método do controller ao ser executado, possui atributos como por exemplo o mockResponse.contentAsString
que verifica o texto enviado pelo controller.\
6 - mockTagLib()
Adiciona alguns métodos dinamicos para testes de tagLibs. Geralmente é usado em conjunto com a classe TagLibUnitTestCase
.