Projeto Web com JUnit para testes (Junit+Web)

4 respostas
andrepapaz

Pessoal,

Não sei se posso utilizar o junit para testes para Web, mas eu acredito que sim, é que no projeto que peguei aqui não tem nenhum.

Bem, eu preciso fazer uma manutenção grande e preferi separar parte do código que gera uma linha de inserção no banco de dados para uma classe de Factory, a CalculoFactory, dessa forma eu poderia manter a funcionalidade do projeto somente devolvendo uma classe CalculoBean e também fazer testes com a mesma.

Porém quando executo o teste ele me retorna o seguinte erro:

javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
	at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645)
	at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
	at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325)
	at javax.naming.InitialContext.lookup(InitialContext.java:392)
	at br.com.athos.persistence.ConnectionFactory.getConnection(ConnectionFactory.java:31)
	at br.com.athos.persistence.AlocacaoPersistence.searchAlocacao(AlocacaoPersistence.java:367)
	at br.com.athos.test.CalculoFactoryTest.testConstroiCalculoBean(CalculoFactoryTest.java:64)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
	at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

Basicamente ele chama o método searchAlocacao da classe AlocacaoBean na linha 14 abaixo:

public void testConstroiCalculoBean() throws SQLException, ParseException {

		CalculoFactory calculoFactory = new CalculoFactory();
		
		SimpleDateFormat data = new SimpleDateFormat("dd/MM/yyyy");
		
		data.parse(strData);

		GregorianCalendar greg = new GregorianCalendar();
		greg.setTimeInMillis(data.getCalendar().getTimeInMillis());

		Timestamp Data = new Timestamp(greg.getTimeInMillis());

		AlocacaoBean alocacao = alocacaoPersistence.searchAlocacao(
				codempresa, matricula, Data);

E da erro na parte do getConnection.

public AlocacaoBean searchAlocacao(Integer codEmpresa, String matricula, Timestamp data) throws SQLException {
		
		AlocacaoBean alocacaoBean = null;
		
		Connection connection = ConnectionFactory.getConnection();

		ResultSet rs = null;

Mais especificamente no (Context) new InitialContext().lookup(“java:comp/env”); do código abaixo.

public static Connection getConnection() {
		
        Connection conn = null;
        
        try {
            
        	/* TOMCAT */  
        	Context ctx	= (Context) new InitialContext().lookup("java:comp/env");
            
            conn 		= ((DataSource) ctx.lookup("jdbc/sqlServerDB")).getConnection(); 
            
        	
        	/* WebSphere 
            InitialContext context = new InitialContext();
            
            conn 		= ((DataSource) context.lookup("jdbc/sqlServerDB")).getConnection();
            */
            
        } catch (Exception e) {
        	
            e.printStackTrace(System.err);        	
        	
        }
        
        return conn ;
    }

Alguém sabe me dizer o que estou fazendo de errado nessa tentativa de utilizar o JUnit para me ajudar?
É o context que não posso depender do TomCat na hora de testar ou eu serei obrigado a criar classes que me retornem um objeto AlocacaoBean já pronto sem depender de acesso no Banco de dados?

Obrigado.

4 Respostas

Hebert_Coelho

Vc ta tentando acessar o contexto do banco de dados com o servidor parado?
Geralmente para JUnit você teria que usar algum tipo de mock.

andrepapaz

Então jake, eu tentei executar o Test do JUnit a principio com o TomCat parado, e depois executando em modo Debug, assim como o Junit em podo Debug também, e desculpe minha ignorância, mas o que seria um mock?

Obrigado.

Hebert_Coelho

Mock é uma simulação, um objeto que deveria se comportar como em tempo real.

No seu caso, a classe Connection utiliza um valor que funciona para tempo real, mas para o JUnit ñ funciona.
O mock seria você criar uma classe (em seu pacote de testes tipo ConnectionMock) e o método iria retornar uma conexão sua que também funcionasse como mock.

Nesse post mostra como levantar um teste em JUnit utilizando um banco de memória, ou seja, HSQLDB.

JUnit com HSQLDB, JPA e Hibernate

Você pode simular um banco com JUnit e testar persistência, consultas e tudo mais.

Você teria apenas que alterar uma abstração para utilizar o banco na hora do teste.

Infelizmente JUnit tem essa desvantagem. =/

Existe também outra ferramentas para Mock como o Mockito. Mas para testar apenas persistência eu prefiro a abordagem do post. [=

andrepapaz

Beleza jake,

Vou tentar utilizar o link que você me passou para conseguir fazer esses testes, caso não funcione vou partir para um mock já voltado para a classe de AlocacaoBean direto, sem a dependência da conexão com o banco.

Obrigado.

Criado 22 de março de 2012
Ultima resposta 22 de mar. de 2012
Respostas 4
Participantes 2