Grails Service Test com withTransaction
08/01/2011 00:00
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
}
}
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))
}
}
Para se registrar, clique aqui.