Spring + junit

5 respostas
aquilante

Amigos estou tentando usar spring + junit mas estou com grandes dificuldades, acredito que nas configurações.

Esse é meu teste:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
 "file:WebRoot/WEB-INF/config/spring/appContext.xml",
 "file:WebRoot/WEB-INF/config/spring/appContext-security.xml",
 "file:WebRoot/WEB-INF/config/spring/appContext-dao.xml",
 "file:WebRoot/WEB-INF/config/spring/appContext-services.xml" })

public class DetalheTeste extends AbstractDependencyInjectionSpringContextTests {
	
	DetalheService service;
	
	@Test
	public void testInjecaoSpring(){
		//assertNotNull(service);
		System.out.println("Service: " + service);
        
       }

	@Test
	public void testeDetalhe() {
		System.out.println("Service: ");
		//assertNull(service.findAll());
	}

	@Autowired
	public void setService(DetalheService service) {
		this.service = service;
	}
}

Com a anottation @RunWith(SpringJUnit4ClassRunner.class) a aplicacação da esse erro:

java.lang.NoSuchMethodError: javax.persistence.PersistenceContext.properties()[Ljavax/persistence/PersistenceProperty;
	at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor$PersistenceElement.<init>(PersistenceAnnotationBeanPostProcessor.java:543)
	at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor$1.doWith(PersistenceAnnotationBeanPostProcessor.java:359)
	at org.springframework.util.ReflectionUtils.doWithFields(ReflectionUtils.java:459)
	at org.springframework.util.ReflectionUtils.doWithFields(ReflectionUtils.java:436)
	at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findPersistenceMetadata(PersistenceAnnotationBeanPostProcessor.java:351)
	at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessMergedBeanDefinition(PersistenceAnnotationBeanPostProcessor.java:296)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyMergedBeanDefinitionPostProcessors(AbstractAutowireCapableBeanFactory.java:743)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:447)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
	at java.security.AccessController.doPrivileged(Native Method)

Sem a annotation @RunWith(SpringJUnit4ClassRunner.class) o meu service fica null.

Alguem pode ajudar ae galera!
:cry:

Obrigado!

5 Respostas

mauriciovoto

Olá, tenho um problema similar ao seu…

O JMock na verdade tenta “mockar” o seu servico e não consegue fazer com a anotação @Autowired.

Em meu trampo, utilizamos o JMock e mockamos os servicos da seguinte maneira:

private Mockery context = new JUnit4Mockery();

final ServicoDeClientes servicoDeClientesMockado = this.context.mock(ServicoDeClientes.class);

Porém, vejo o fato de não conseguir “mockar” quem está anotado como @Autowired como um problema…por exemplo se dentro de meu servico, tiver um repositorio anotado com @Autowired, precisamos “setar” na mão o repositório para que no teste não fique null.

Vou dar uma estudada em JMock + Spring para tentar entender o que ocorre, mas se alguém puder dar uma luz, agradeço também !

mauriciovoto

Esqueci de dizer q ao inves de anotar os testes com: @RunWith(SpringJUnit4ClassRunner.class) anotamos com @RunWith(JMock.class).

aquilante

mauriciovoto,

Usando mock como vc exemplificou da certo, mas não é carregado realmente meu serviço. Se eu quizer usar um método de banco n vai funcionar.

por exemplo:

@ContextConfiguration(locations = {
 "file:WebRoot/WEB-INF/config/spring/appContext.xml",
 "file:WebRoot/WEB-INF/config/spring/appContext-security.xml",
 "file:WebRoot/WEB-INF/config/spring/appContext-dao.xml",
 "file:WebRoot/WEB-INF/config/spring/appContext-services.xml" })

@Transactional
@TransactionConfiguration(defaultRollback = false)
public class DetalheTeste extends AbstractDependencyInjectionSpringContextTests {
	
	private Mockery context = new JUnit4Mockery();
	
	final DetalheService service = this.context.mock(DetalheService.class); 
	
	@Test
	public void testInjecaoSpring(){
		Detalhe detalhe = new Detalhe();
		detalhe.setDescricao("TesteJunitMock");
		
		System.out.println("Salva o cara.");
		service.insert(detalhe);
		
		System.out.println("busca o cara.");
		assertNotNull(service.findByExample(detalhe));
        
    }

Dessa forma n consigo salvar o objeto pq eu instanciei com o mock, mas como eu faço isso com o spring?
Alguém pode dar uma luz ae!!! :roll:

Vlw.

aquilante

Galera vc usam a annotation?

@RunWith(SpringJUnit4ClassRunner.class)

Pelo q vi ela é quem carrega o contexto do spring, podem me corrigir se estiver errado. Para usa-la presisa de alguma configuração específica no spring-config?

mauriciovoto

Olá aquilante, entendi sua necessidade.

Na verdade, quando comentei sobre o mock, esqueci de mencionar que a idéia seria “simular” os objetos.

Pesquisando um pouco, encontrei um exemplo, porém não o testei, veja se te ajuda: http://thiagoprocaci.blogspot.com/2009/04/o-teste-unitario-e-uma-modalidade-de.html. Aparentemente está bem parecido com o que você postou aqui…

Preciso estudar um pouco mais sobre testes unitários. Eu e a equipe do meu trampo, por várias vezes debatemos sobre por exemplo, a necessidade de os testes chegarem ao banco de dados.

Alguém teria um argumento rápido para convencer de ao invés de simular um objeto mockado, fazer o teste recuperar o objeto do banco de dados ??? Vou pensar sobre abrir um tópico para esta discussão.

Um post interessante aqui no GUJ sobre isto:

http://www.guj.com.br/posts/list/34906.java

Desculpe fugir um pouquinho do assunto…
:stuck_out_tongue:

Criado 25 de novembro de 2009
Ultima resposta 28 de nov. de 2009
Respostas 5
Participantes 2