Teste Unitário + Spring

12 respostas
F

Bom dia a todos.
Estou tentando criar uma classe para teste unitário. A classe que estarei testando utiliza DAOS carregados pelo listener do meu web.xml. Portanto, eu estou com dificuldades para que meus objetos daos sejam instanciados pelo spring sem q a aplicação seja startada.
Estou seguindo a documentação do Spring Testing, mas está ocorrendo o seguinte erro:

Se alguém souber me ajudar…

Abraço.

12 Respostas

F

Olá.
Tem que se ligar em duas coisas. Se voce colocar uma propriedade e um set, o autowire
vai ser BY_TYPE

Se você não colocar o set, definir a propriedade como protected e chamar

Então vai ser autowire BY_NAME pelo nome da propriedade.

Tem que ver qual a situação que você está usando, e se o spring vai conseguir
injetar esse dependencia ‘interesDAO’

F

Fabio,
obrigado pela resposta. Bom eu começei a trabalhar com o spring ontem, e eu ainda não domino ele, portanto eu simplesmente copiei da documentação exemplos pra fazer funcionar, e está funcionando, agora no teste unitário estou com esse problema. Agora se o autowire vai ser BY_TYPE ou BY_NAME eu não sei o que é. Será q com essas informações que te passei teria como eu realizer o teste??
Meu applicationContext.xml:

...
<beans default-autowire="byName">
...
<bean id="interesDAO" class="com.aix.gen.dao.InteresDAO" singleton="true">
...
</beans>

Abraço.

F

BY_NAME = vai tentar achar um bean com o mesmo nome, exemplo o teu ‘interesDAO’.

BY_TYPE = vai tentar achar qualquer bean do mesmo tipo, na verdade tem que ser unico,
do tipo da classe declarada, no teu caso o
com.aix.gen.dao.InteresDAO

Tu pode fazer o seguinte:

  1. Verificar se está carregando o applicationContext.xml

  2. Usar a propriedade do tipo ‘interesDAO’ que seja privada e tenha um set. Mas assim não pode ter outro bean da classe
    com.aix.gen.dao.InteresDAO nos teus contextos
    Pois ele vai fazer um BY_TYPE

  3. Ou, colocar essa mesma propriedade protected, com o mesmo nome do bean, no caso ‘interesDAO’ ,
    tirar o set, e chamar o setPopulateProtectedVariables.
    Assim ele vai fazer um BY_NAME

Tanto o 2 quanto o 3 tem que funcionar se ele leu direito o teu applicationContext.xml

F

Fábio, valeu mesmo pela atenção. Vou continuar testando aqui, se eu conseguir eu te falo. Mto obrigado mais uma vez.

R

O Spring fornece algumas classes para facilitar testes como AbstractDependencyInjectionSpringContextTests que faz injeção de dependencia na própria classe de teste e AbstractTransactionalDataSourceSpringContextTests que faz roolback pra manter estado do banco quando você quer testar integração com o banco.

Mais detalhes em http://www.springframework.org/docs/reference/testing.html

[]'s

Rodrigo Auler

F

Fábio, bom, eu fiz como vc disse, e como está mostrando lah na documentação que falei no link:

public class ActInteressadosWebTest extends AbstractDependencyInjectionSpringContextTests {
  
  protected InteresDAO interesDAO;
  
  protected String[] getConfigLocations() {
      return new String[] { "applicationContext*" };
  }

  public ActInteressadosWebTest(){
     setPopulateProtectedVariables(true);
  }
}

E agora não está ocorrendo nenhum erro. Mas o meu interesDAO vem null. Eu acho que está carregando o meu xml certo sim. E na verdade o meu xml fica dentro de /WEB-INF/applicationContext.xml, mas como não encontrava nem F***. eu coloquei o arquivo na mesma pasta q a classe de Teste só pra eu testar mesmo…
Agluma dica?

Abraço.

F

“applicationContext*”

Isso funciona?
Nunca usei, e fiz um test aqui e nao funcionou…
Tenta colocar o nome certinho.

F

Oi Fabio.
Eu coloquei desta forma pq eu tb estava com problemas pra encontrar o applicationContext.xml, daí eu li que assim funcionava.

Olha só, o meu applicationContext.xml está dentro de WEB-INF. E se eu fizer:

return new String[] { "/WEB-INF/applicationContext.xml" };
//ou:

return new String[] { "WEB-INF/applicationContext.xml" };

//Ou até mesmo se eu colocar o applicationContext.xml dentro do memso package da classe de teste:

return new String[] { "applicationContext.xml" };

Ocorre um erro de fileNotFoundException. Então, já que você falou, que do jeito: applicationContext* não funciona tb, eu vou continuar tentando aqui… vlws!!!

F

Tenta colocar na raiz do teu source

E carrega assim
String[] { “applicationContext.xml” };

F

Ahhh muleque. Muitissimo obrigado pela ajuda viu. :slight_smile:
Funcionou certim. Agora soh falta fazer carregar o arquivo que está em web-inf/applicationContext.xml ao invéz de pegar do Source.
Mas já está funcionando já Fábio. Valeu de novo cara!

F

Pra quem for usar com annotations

http://www.belisarioconsultoria.com.br/blog/?p=14

T

Segue um link interessante sobre o assunto.
Lá tem um exemplo bem completo sobre spring-test (usando anotação).

Criado 15 de maio de 2007
Ultima resposta 23 de abr. de 2009
Respostas 12
Participantes 5