JUnit para J2EE

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:

[code]/*

import java.rmi.RemoteException;

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

import junit.framework.TestCase;

/**

/
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("rodrigo@goodcard.com.br", "http://www.usiinformatica.com.br", "rodrigo", "Rodrigo Urubatan Ferreira Jardim", "rodrigo", "Rodrigo U. F. Jardim", new Integer(1234567890), 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().
}

}
[/code]

e assim não:

[code]/*

import java.rmi.RemoteException;

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

import junit.framework.TestCase;

/**

/
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("rodrigo@goodcard.com.br", "http://www.usiinformatica.com.br", "rodrigo", "Rodrigo Urubatan Ferreira Jardim", "rodrigo", "Rodrigo U. F. Jardim", new Integer(1234567890), 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().
}

}
[/code]

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 :frowning:
se alguem tiver uma dica, agradeço :slight_smile:

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:

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:

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:

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]