JUnit para J2EE

4 respostas
urubatan

não sei se alguem aqui ja teve este problema, mas esta me acontecendo o seguinte

quando executo o TestCase que escrevi para um EJB da ClassCastException quando vou fazer o narrow do objeto retornado no lookup

por exemplo assim funciona:
/*
 * Created on 29/08/2003
 *
 * Propriedade intelectual de <a href="http://www.usiinformatica.com.br">USI Informatica</a>
 */
package com.topazio.template.ejb.negocio;

import java.rmi.RemoteException;

import com.topazio.template.ejb.persistencia.exceptions.TemplateException;
import com.topazio.template.ejb.persistencia.interfaces.UsuarioIntf;

import junit.framework.TestCase;

/**
 * Propriedade intelectual de <a href="http://www.usiinformatica.com.br">USI Informatica</a>
 * Criado em 29/08/2003
 * 
 * @author Rodrigo
 *
 */
public class LojaBeanTest extends TestCase {
	private LojaHome home;
	private Loja loja; 
	/**
	 * Constructor for LojaBeanTest.
	 * @param arg0
	 */
	public LojaBeanTest(String arg0) {
		super(arg0);
	}

	public static void main(String[] args) {
		//junit.swingui.TestRunner.run(LojaBeanTest.class);
		LojaBeanTest t = new LojaBeanTest("teste");
		try {
			t.setUp();
			t.testCriarUsuario();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/*
	 * @see TestCase#setUp()
	 */
	protected void setUp() throws Exception {
		home = LojaUtil.getHome();
		loja = home.create();
	}

	/*
	 * @see TestCase#tearDown()
	 */
	protected void tearDown() throws Exception {
		super.tearDown();
	}

	public void testCriarUsuario() {
		try {
			Boolean created = loja.criarUsuario("[email removido]", "http://www.usiinformatica.com.br", "rodrigo", "Rodrigo Urubatan Ferreira Jardim", "rodrigo", "Rodrigo U. F. Jardim", new Integer([telefone removido]), new Integer(1234), "Visa", "São Leopoldo", "apto 302", "RS", new Integer(1026), "João Neves da Fontoura");
			//assertNotNull(created);
			//assertEquals(created,Boolean.TRUE);
			UsuarioIntf u = loja.getUsuario();
			//assertNotNull(u);
		} catch (RemoteException e) {
			e.printStackTrace();
			assertNull(e);
		} catch (TemplateException e) {
			e.printStackTrace();
			assertNull(e);
		}		
	}

	public void testLoginUsuario() {
		try {
			Boolean login = loja.loginUsuario("rodrigo","rodrigo");
			assertEquals(login,Boolean.TRUE);
			UsuarioIntf u = loja.getUsuario();
			assertNotNull(u);
			assertEquals(u.getNome(),"rodrigo");
		} catch (RemoteException e) {
			e.printStackTrace();
			assertNull(e);
		} catch (TemplateException e) {
			e.printStackTrace();
			assertNull(e);
		}
	}


	public void testListarProdutosLoja() {
		//TODO Implement listarProdutosLoja().
	}

	public void testRecuperarSenhaUsuario() {
		//TODO Implement recuperarSenhaUsuario().
	}

	public void testGetUsuario() {
		//TODO Implement getUsuario().
	}

	public void testSetUsuario() {
		//TODO Implement setUsuario().
	}

	public void testFecharCarrinho() {
		//TODO Implement fecharCarrinho().
	}

	public void testListarComprasUsuario() {
		//TODO Implement listarComprasUsuario().
	}
}
e assim não:
/*
 * Created on 29/08/2003
 *
 * Propriedade intelectual de <a href="http://www.usiinformatica.com.br">USI Informatica</a>
 */
package com.topazio.template.ejb.negocio;

import java.rmi.RemoteException;

import com.topazio.template.ejb.persistencia.exceptions.TemplateException;
import com.topazio.template.ejb.persistencia.interfaces.UsuarioIntf;

import junit.framework.TestCase;

/**
 * Propriedade intelectual de <a href="http://www.usiinformatica.com.br">USI Informatica</a>
 * Criado em 29/08/2003
 * 
 * @author Rodrigo
 *
 */
public class LojaBeanTest extends TestCase {
	private LojaHome home;
	private Loja loja; 
	/**
	 * Constructor for LojaBeanTest.
	 * @param arg0
	 */
	public LojaBeanTest(String arg0) {
		super(arg0);
	}

	public static void main(String[] args) {
		junit.swingui.TestRunner.run(LojaBeanTest.class);
	}

	/*
	 * @see TestCase#setUp()
	 */
	protected void setUp() throws Exception {
		home = LojaUtil.getHome();
		loja = home.create();
	}

	/*
	 * @see TestCase#tearDown()
	 */
	protected void tearDown() throws Exception {
		super.tearDown();
	}

	public void testCriarUsuario() {
		try {
			Boolean created = loja.criarUsuario("[email removido]", "http://www.usiinformatica.com.br", "rodrigo", "Rodrigo Urubatan Ferreira Jardim", "rodrigo", "Rodrigo U. F. Jardim", new Integer([telefone removido]), new Integer(1234), "Visa", "São Leopoldo", "apto 302", "RS", new Integer(1026), "João Neves da Fontoura");
			//assertNotNull(created);
			//assertEquals(created,Boolean.TRUE);
			UsuarioIntf u = loja.getUsuario();
			//assertNotNull(u);
		} catch (RemoteException e) {
			e.printStackTrace();
			assertNull(e);
		} catch (TemplateException e) {
			e.printStackTrace();
			assertNull(e);
		}		
	}

	public void testLoginUsuario() {
		try {
			Boolean login = loja.loginUsuario("rodrigo","rodrigo");
			assertEquals(login,Boolean.TRUE);
			UsuarioIntf u = loja.getUsuario();
			assertNotNull(u);
			assertEquals(u.getNome(),"rodrigo");
		} catch (RemoteException e) {
			e.printStackTrace();
			assertNull(e);
		} catch (TemplateException e) {
			e.printStackTrace();
			assertNull(e);
		}
	}


	public void testListarProdutosLoja() {
		//TODO Implement listarProdutosLoja().
	}

	public void testRecuperarSenhaUsuario() {
		//TODO Implement recuperarSenhaUsuario().
	}

	public void testGetUsuario() {
		//TODO Implement getUsuario().
	}

	public void testSetUsuario() {
		//TODO Implement setUsuario().
	}

	public void testFecharCarrinho() {
		//TODO Implement fecharCarrinho().
	}

	public void testListarComprasUsuario() {
		//TODO Implement listarComprasUsuario().
	}
}

a unica diferença esta em rodar o codigo utilizando JUnit ou rodar utilizando direto o metodo main

não consegui entender o que ta acontecendo :-(
se alguem tiver uma dica, agradeço :-)

4 Respostas

urubatan

ahh, mais uma coisa,
esta é uma aplicação de exemplo que to escrevendo para convencer o pessoal da empresa onde estou trabalhando a utilizar J2EE como tecnologia de componentes :slight_smile:

a ideia até o momento é utilizar J2EE para os componentes e para a interface WEB

e PowerBuilder chamando os EJBs por corba para os clientes GUI (não consegui tirar o PB de la de geito nenhum, não sei o que tanto eles gostam desta ferramenta que gera programas com cara de windows 3.11 :slight_smile: )

valeu qualquer dica ai galera :slight_smile:

cv1

Se eu entendi direito, vc nem esta chamando o PortableRemoteObject.narrow… talvez esteja ai o seu ClassCastException: o JUnit usa um esquema de classloaders diferente, entao vc vai ter problemas se fizer isso :wink:

cv1

Pois eh… uma coisa que eu tambem nao entendo… como e’ que tem gente que gosta de PowerBuilder?! :smiley:

Pelo pouco que eu vi de PB tambem, achei uma desgraca total, mas ele tem uma coisa interessante: o pessoal que eu vi mexendo com ele e’ produtivo pra cacete… mas ai eu ja nao sei se sao os caras ou se era a ferramenta que dava uma boa maozinha nesse tipo de coisa… talvez um misto dos dois :wink:

urubatan

estou usando sim,
mandei esta unit de codigo pois é o unico lugar que alterei para funcionar e para não funcionar,
a classe LojaUtil foi gerada pelo XDoclet, e dentro do metodo getHome()

que é chamado no metodo setUp() da classe de testes

mas realmente é problema com o classloader do JUnit, que mesmo chamando o PortableRemoteObject.narrow()
só para não ficar duvida, ta ai o codigo da classe LojaUtil

/**
    * Obtém a interface remota a partir do contexto inicial padrão
    * @return Interface Home para Loja. Busca usando JNDI_NAME
    */
   public static com.topazio.template.ejb.negocio.LojaHome getHome() throws javax.naming.NamingException
   {
      if (cachedRemoteHome == null) {
         // Obtém o contexto inicial
         javax.naming.InitialContext initialContext = new javax.naming.InitialContext();
         try {
            java.lang.Object objRef = initialContext.lookup(com.topazio.template.ejb.negocio.LojaHome.JNDI_NAME);
            cachedRemoteHome = (com.topazio.template.ejb.negocio.LojaHome) javax.rmi.PortableRemoteObject.narrow(objRef, com.topazio.template.ejb.negocio.LojaHome.class);
         } finally {
            initialContext.close();
         }
      }
      return cachedRemoteHome;
   }

conseguir fazer funcionar meia boca chamando o getHome e o create dentro de um bloco de inicialização estatica da classe do teste :slight_smile:

sei que é chinelagem, mas resolveu o problema por enquanto :slight_smile:
[/code]

Criado 29 de agosto de 2003
Ultima resposta 30 de ago. de 2003
Respostas 4
Participantes 2