EJB+JUnit

8 respostas
programadora

Pessoal,

não consigo rodar meus testes utilizando JUnit com EJB3. Ocorre uma exceção assim que o método “lookup” é executado, e o erro que ocorre é o seguinte:

javax.naming.NameNotFoundException: br.org.bolsaTrabalho.controller.CurriculoControllerLocal not bound

Já olhei no JBoss no endereço http://localhost:8080/jmx-console/ e acredito que esteja tudo ok (vi isso em um artigo)

O meu código é o seguinte:

public class CurriculoTeste extends TestCase {

	protected CurriculoControllerLocal curriculoControllerLocal;

	public void setUp() throws Exception {
		try {
			Properties properties = new Properties();
			properties.put("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
			properties.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
			properties.put("java.naming.provider.url", "jnp://localhost:1099");
			properties.put("jnp.parsedName", "false");
			
			
			Context context = new InitialContext(properties);

			Object finderRef = context.lookup(CurriculoControllerLocal.class.getName());
			curriculoControllerLocal = (CurriculoControllerLocal) PortableRemoteObject
					.narrow(finderRef, CurriculoControllerLocal.class);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		junit.textui.TestRunner.run(suite());
	}

	public static TestSuite suite() {
		return new TestSuite(CurriculoTeste.class);
	}

	public void testListagem() throws Exception {
		ProfissionalBolsa prof = new ProfissionalBolsa();
		prof.setIdProfissionalBolsa(1);
		assertEquals(new ArrayList<Curriculo>(), curriculoControllerLocal.listarCurriculosByProfissional(prof));
	}
}


8 Respostas

T

br.org.bolsaTrabalho.controller.CurriculoControllerLocal Não é o endereço JNDI do sessionbean.

procure no log do jboss ao inicializar. Lá tem o endereco correto.

Geralmente é assim: java:comp/env/ejb/CurriculoControllerLocal

sf.marcius

opa, blz?

eu tambem sofri pra conseguir executar testes do junit que fizesse acesso aos meus ejbs em um servidor.
dava javax.naming.NameNotFoundException e olhando no console admin mostrava que o bean tava lá.

No meu caso uso o glassfish, então eu coloquei os seguintes jars no test classpath do meu projeto (netbeans):

appserv-admin.jar
appserv-deployment-client.jar
appserv-ext.jar
appserv-launch.jar
appserv-rt.jar
glassfish-clapi.jar

acredito que para o JBoss deva mudar alguma coisa… mas já pode te dar uma luz.

programadora

Obrigada pelas respostas!

Seguinte, eu “resolvi” o problema da seguinte forma:

primeiramente, como o thiagomoraes falou, eu estava pegando o endereço JNDI errado… Troquei para “BolsaTrabalhoEA2/CurriculoController/local” e mesmo assim não funcionou… dava o seguinte erro:

Aí, pesquisando na internet, eu vi que algumas pessoas não conseguiam executar o “lookup” com uma interface local… Então eu mudei minha interface para @Remote e consequentemente o meu endereço de JNDI para “BolsaTrabalhoEA2/CurriculoController/remote” aí funcionou… Ou melhor, parou de dar o erro no “lookup”.
No final das contas, fiquei com a seguinte configuração na minha classe de teste:

public class CurriculoTeste extends TestCase {

	protected CurriculoControllerLocal curriculoControllerLocal;

	public void setUp() throws Exception {
		try {
			Properties properties = new Properties();
			properties.put("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
			properties.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
			properties.put("java.naming.provider.url", "jnp://localhost:1099");
			
			Context context = new InitialContext(properties);
			Object finderRef = context.lookup("BolsaTrabalhoEA2/CurriculoController/remote");
			curriculoControllerLocal = (CurriculoControllerLocal) PortableRemoteObject
				.narrow(finderRef, CurriculoControllerLocal.class);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		junit.textui.TestRunner.run(suite());
	}

	public static TestSuite suite() {
		return new TestSuite(CurriculoTeste.class);
	}

	public void testListagem() throws Exception {
		ProfissionalBolsa prof = new ProfissionalBolsa();
		prof.setIdProfissionalBolsa(1);
		assertEquals(new ArrayList<Curriculo>(), curriculoControllerLocal.listarCurriculosByProfissional(prof));
	}
}

só que agora, quando chamo qualquer método do curriculoControllerLocal, ele dá o seguinte erro:

java.io.EOFException at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:691)

Help me!

T

Suas entidades são Serializáveis ?

programadora

Não… elas precisam ser!!!

T

Sim, pois seu session bean é remote.

Sendo assim, irá fazer uso da serializacao (Marshal, Unmarshal)dos seus objetos pois a é remota.

gbvbahia01

http://netbeans.org/kb/docs/javaee/javaee-entapp-junit.html#Exercise_1b

gomesrod

programadora:
… algumas pessoas não conseguiam executar o “lookup” com uma interface local… Então eu mudei minha interface para @Remote e consequentemente o meu endereço de JNDI para “BolsaTrabalhoEA2/CurriculoController/remote”

Só esclarecendo o que acontece aqui:
Os EJBs locais são apenas para uso na mesma JVM. No caso, apenas classes que estão rodando dentro do JBoss (por exemplo: aplicacoes web, outros ejbs) poderiam acessar.

Seu teste automatizado é um processo stand-alone que se conecta pela rede ao JBoss para obter o EJB, e por isso ele deve utilizar a interface remota.

Outra coisa… Você mudou a anotação para @Remote, mas deveria também ter renomeado a interface CurriculoControllerLocal para CurriculoControllerRemote. Não é que não funcione, mas esse nome é enganador e pode se tornar uma armadilha para o próximo a dar manutenção no código (pode até ser voce mesmo !)

E finalmente: também é possível ter as duas interfaces (@Local e @Remote) para o mesmo EJB, considere essa possibilidade caso necessário.

Criado 26 de maio de 2010
Ultima resposta 25 de out. de 2011
Respostas 8
Participantes 5