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