[RESOLVIDO]Testes com Spring 3 + JUnit

4 respostas
furacao123
estou tentando desenvolver classes de testes com JUnit e Spring 3, mas estou tendo problemas com sessao, esta dando lazyException, e quero entender o porque que esta perdendo a sessao, segue a classe de teste
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"applicationContext-test.xml"})
public class LojaServiceImplTest {

@Autowired
    protected LojaService lojaService;

    public LojaServiceImplTest() {
    }

@Test
    public void testMostraListBairro(){
        System.out.println("---MostraListBairro---");
        Loja loja = lojaService.getById(1);
        
        List<LojaBairro> lojaBairroList = loja.getLojaBairroList();

        for (LojaBairro lojaBairro : lojaBairroList) {
            System.out.println("Bairro: "+lojaBairro.getBairro().getNome());
        }

        assertTrue(lojaBairroList.size() > 0);
    }
}

quando eu faço o getById me retorna o objeto loja, mas logo abaixo todas as listas de relacionamento, no caso a lista de bairro vem em lazy, mas ao tentar acessar ja dispara o lazyException, mas porque logo abaixo vindo de um select ele ja vem com a sessao fechada? A cada requisicao o Spring ja fecha a sessao?

segue o meu service
@Override
    @Transactional(readOnly = true, propagation = Propagation.REQUIRED, rollbackFor = RuntimeException.class)
    public Loja getById(int id) {
        return lojaDao.findById(id);
    }
segue o DAO
public T findById(ID id, boolean lock) {
        Object entity;
        if (lock) {
            entity = getEntityManager().find(getEntityBeanType(), id);
            this.em.lock(entity, LockModeType.WRITE);
        } else {
            entity = getEntityManager().find(getEntityBeanType(), id);
        }
        return (T) entity;
    }

mas isso nao acontece apenas com o byId, se eu utilizar o merge logo depois do findById, ele ativa um dos bags mas nao todos, alguem poderia me explicar melhor o que acontece com o Spring, pois sempre utilizei em Desktop e no desktop eu faço o em.clear para zerar a sessao e nao fica cache, mas no caso da web pensei que seria diferente.

4 Respostas

furacao123

axei algo sobre o assunto http://www.coderanch.com/t/422286/Testing/Lazy-Initialization-Exception-while-running

mas nao entendi de onde vem os metodos sobscritos

protected void onTearDown()

protected void onSetUp()

paulo1911

Crie uma classe Abstrata AbstractSpringTestCase e anote ela com o

@RunWith(SpringJUnit4ClassRunner.class)  
@ContextConfiguration({"applicationContext-test.xml"}) 
public abtract class AbstractSpringTestCase{

//metodos utilitários para os testes



}

e suas classes de teste vc estende a classe de teste abstrata.

outra dica é vc usar as apis do mockito para criar mocks dos repositórios, testando suas implementações separadamente
Fallow

furacao123
fiz a classe
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"applicationContext-test.xml"})
@TransactionConfiguration(transactionManager="txManager")
public abstract class AbstractSpringTestCase {
    
}
e a minha classe de teste
public class LojaServiceImplTest extends AbstractSpringTestCase {

    @Autowired
    protected LojaService lojaService;

    public LojaServiceImplTest() {
    }

   @Test
    public void testMostraListBairro() {
        System.out.println("---MostraListBairro---");
        Loja loja = lojaService.getById(1);

        for (LojaBairro lojaBairro : loja.getLojaBairroList()) {
            System.out.println("Bairro: " + lojaBairro.getBairro().getNome());
        }

        assertTrue(loja.getLojaBairroList().size() > 0);
    }

Mas mesmo assim quando eu chamo a lista de lojaBairroList me retorna LazyException

furacao123

Agora o problema do lazy resolvido, tem de adicionar o @Transactional para que entre em vigor as configurações do service para controle da transação.

[code]@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"applicationContext-test.xml"})
@TransactionConfiguration(transactionManager="txManager")
@Transactional
public abstract class AbstractSpringTestCase {

}

Criado 18 de janeiro de 2012
Ultima resposta 19 de jan. de 2012
Respostas 4
Participantes 2