Testes Unitários com Spring

Boa noite pessoal

Estou trabalhando no desenvolvimento de um sistema Web com JSF + Spring + Jpa - Hibernate + Acegi.

O modelo arquitetural que estamos usando é baseado na criação de componentes de negócio em jar’s separados. Ou seja, tenho um jar para Pedido, um jar para Produto e assim por diante, conforme o modelo de negócio.

Os jar’s são utilizados por uma aplicação web JSF.

Acontece que quero utilizar alguns conceitos de TDD, ou seja, guiar o desenvolvimento, em especial dos componentes a partir de testes unitários.

Estou tentando utilizar a API de testes proposta pelo Spring 2.5, com base no JUnit4. Minha intenção é que o desenvolvedor consiga testar o componente de forma indendente da aplicação Web. Então, minhas classes de testes devem carregar o contexto transacional do JPA, a amarração dos objetos do spring-config e assim por diante.

Codifiquei uma primeira classe base desta forma:


@TestExecutionListeners({
DependencyInjectionTestExecutionListener.class,
TransactionalTestExecutionListener.class})
@Transactional
@ContextConfiguration
public class CotacaoManagerTest extends AbstractTransactionalJUnit4SpringContextTests {

    //objetos que seráo carregados pelo spring via ID.
    @Autowired
    CotacaoService cotacaoService;
    @Autowired
    EntityService entityService;
    
    
    @Test
    public void save(Cotacao cotacao) {
        String cnpj = "";
        Cliente c = entityService.getClienteByCnpj(cnpj);
        assertEquals("Testando o cliente retornado pelo cnpj = " + cnpj, c.getCnpj());

        Cotacao cot = cotacaoService.createCotacao();
        cot.setTitulo("Cotacao Teste HHP");
        cot.setCliente(c);
        cot.setComprador(c.getCompradores().get(0));
        
        int nrBefore = super.countRowsInTable("COTACAO");
        cotacaoService.save(cotacao);
        int nrAfter = super.countRowsInTable("COTACAO");

        assertEquals("Número de registros na tabela deve ser igual ao anterior + 1 ", nrBefore + 1, nrAfter);
        
    }
     
}

Segundo a documentação de testes do spring (http://static.springframework.org/spring/docs/2.5.x/reference/testing.html), a annotation @ContextConfiguration carregaria o contexto do spring e JPA presente no arquivo -context.xml que existe no meu diretório de testes.

Agora, não sei se isto está correto.

Quando tento rodar o teste pelo netBeans, ele dá o seguinte erro:

Null Test: 	Caused an ERROR
null
java.lang.reflect.InvocationTargetException
	at java.lang.reflect.Constructor.newInstance(Constructor.java:494)
Caused by: java.lang.TypeNotPresentException: Type [unknown] not present
	at $Proxy7.value(Unknown Source)
Caused by: java.lang.NoClassDefFoundError: org/junit/internal/runners/JUnit4ClassRunner
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
	at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
	at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:242)
	at java.lang.Class.initAnnotationsIfNecessary(Class.java:3031)
	at java.lang.Class.initAnnotationsIfNecessary(Class.java:3038)
	at java.lang.Class.initAnnotationsIfNecessary(Class.java:3038)
	at java.lang.Class.getAnnotation(Class.java:2989)

Jà pesquisei bastante, mas como podem ver o erro é pra lá de estranho e pouco esclarecedor para quem está iniciando agora o trabalho com testes no Spring.

Gostaria de saber se alguém pode dar uma ajuda.

Espero ter sido claro.

Um abraço

Jean Streleski

tenta criar um construtor padrao e os metodos set das 2 propriedades autowired

Opa!

Valew pela dica!
Fiz isto, mas acabou não resolvendo.

Porém, percebi a partir do Stack Trace que ele não estava achando uma classe do JUnit.

Estava usando JUnit 4.1. Substitui pelo JUnit 4.4 e funcionou.

Ainda está dando um probleminha na injeção dos objetos autoWired, porém ao menos o teste está rodando. :smiley:

Vou tentar resolver aqui e caso tenha novas dúvidas ou possa contibuir neste post, volto a postar.