Grails Service Test com withTransaction
08/01/2011 00:00
0
Pessoal, perdi um bom tempo procurando como fazer um mock pro withTransaction, então pra quem precisar segue abaixo exemplo de implementação de teste de serviço.

O post original pode ser encontrado aqui

Implementação do mock:

package com.app.portal

import grails.test.GrailsUnitTestCase

import org.junit.After;
import org.junit.Before;
import org.springframework.transaction.TransactionStatus

class BaseUnitTestCase extends GrailsUnitTestCase {

def statusControls

@Before
protected void setUp() {
super.setUp()
statusControls = []
}

@After
protected void tearDown(){
statusControls.each{
it.verify()
}
statusControls.clear()
super.tearDown()
}

def mockForTransaction(Class clazz,boolean expectRollback = false){
registerMetaClass(clazz)
def statusControl = mockFor(TransactionStatus)
statusControls << statusControl
if(expectRollback)
statusControl.demand.setRollbackOnly(1..1) { println 'setRollbackOnly called'}
def status = statusControl.createMock()
clazz.metaClass.'static'.withTransaction = {
Closure callable -> callable.call(status)
}
return statusControl
}
}


Exemplo implementação de teste (o pacote do seu test deve ser o mesmo pacote do seu service):

package com.app.portal.services


import com.app.portal.BaseUnitTestCase;
import com.app.portal.domain.MinhaEntidade;

import grails.test.*
import org.junit.*
import static org.junit.Assert.*
import static org.hamcrest.CoreMatchers.*
import static org.junit.matchers.JUnitMatchers.*

class ExemploServiceTests extends BaseUnitTestCase {

@Before
void setUp() {
super.setUp()

// faz um mock do sendMail caso seja um teste unitário e seu serviço utilize o mailService
registerMetaClass ExemploService
ExemploService.metaClass.static.sendMail = {}
}

@After
void tearDown() {
super.tearDown()
}

@Test
void handleTest() {
// Exemplo de mock para o Config.groovy, caso seja teste de integração e seu serviço envia email
mockConfig '''
grails.mail.disabled=true
'''

def ExemploService service = new ExemploService()
// aqui é realizado o mock do withTransaction, deve ser obrigatoriamente
// chamado antes de mockDomain
mockForTransaction(MinhaEntidade)
mockDomain(MinhaEntidade)

// mock para log.debug no serviço
mockLogging ExemploService, true

def minhaInstancia = service.fazerQualquerCoisaQueCrieMinhaEntidadeComWithTransaction()

assertEquals 1, MinhaEntidade.count()
assertNotNull(MinhaEntidade.findById(minhaInstancia.id))

}

}


É isso aew o/
Tags: Snippets


Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto