[Java EE] Problema JUnit e alcuni chiarimenti su jee

Sevenjeak

Utente Attivo
27 Nov 2012
80
2
8
31
sevenjeak.altervista.org
Sto studiando in questo periodo Java EE ( seguendo in particolar modo le guide su html.it ), comunque, ho iniziato con studiare il jsp le servlet e le ejb, ora sto vedendomi i Session Bean Stateless, e fin qui tutto apposto.

Seguendo in particolare questa guida:

http://www.html.it/guide/guida-j2ee/

Come scritto nel capitolo 3, mi sono creato un progetto ear ( che da quello che ho ben capito mi occorre principalmente per distribuire in futuro i moduli ejb contenuti in esso, o sbaglio? ), per poi creare un progetto ejb, ho collegato, come scritto in guida il projetto ejb al modulo enterprise ( progetto ear ), l'unico cambiamento che ho fatto, e nel codice, creando una classe che per adesso, contiene due semplici metodi, uno che ritorna il parametro passato incrementato e l'altro che lo ritorna decrementato.

Tutto il codice, l'interfaccia comune e l'interfaccia locale e remota lo inserito nel pachetto testing.stateless, contenente questi sorgenti:

TestStatelessInterface.java ( interfaccia comune )
Codice:
package testing.stateless;

public interface TestStatelessInterface {
    public int increseValue(int value);
    public int decreaseValue(int value);
}
TestStatelessLocal.java ( interfaccia locale )
Codice:
package testing.stateless;

import javax.ejb.Local;

@Local
public interface TestStatelessLocal extends TestStatelessInterface {

}
TestStatelessRemote.java ( interfaccia remota )
Codice:
package testing.stateless;

import javax.ejb.Remote;

@Remote
public interface TestStatelessRemote extends TestStatelessInterface {

}
TestStateless.java ( classse del session bean )
Codice:
package testing.stateless;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;

/**
 * Session Bean implementation class TestStateless
 */
@Stateless(mappedName = "TestStateless")
public class TestStateless implements TestStatelessRemote, TestStatelessLocal {

    /**
     * Default constructor.
     */
    public TestStateless() {
        // TODO Auto-generated constructor stub
    }

    @Override
    public int increseValue(int value) {
        // TODO Auto-generated method stub
        return value++;
    }

    @Override
    public int decreaseValue(int value) {
        // TODO Auto-generated method stub
        return value--;
    }

}
Il problema e quando eseguo l'unit test ( provando a crearla sia nel metodo utilizzato nella stessa guida che con junit5, prendendo spunto da altre guide online ).

In poche parole la unit test che ho realizzato e questa ( si trova nel packege test dello stesso progetto ejb ):

Codice:
package test;

import static org.junit.jupiter.api.Assertions.*;

import java.util.Properties;

import testing.stateless.TestStatelessRemote;
import javax.naming.*;

import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;

import junit.framework.TestCase;


class IntegrationTest {
    private static Context namingContext;
    private static TestStatelessRemote ejbRemote;
    private static final String REMOTE_JNDI_NAME="/FirstEar/FirstEJBProject/TestStateless!testing.stateless.TestStatelessRemote";
 
    @BeforeAll
    public static void init() {
        try {
            Properties jndiProperties = new Properties();
            jndiProperties.put("jboss.naming.client.ejb.context", true);
            jndiProperties.put(Context.PROVIDER_URL, "http-remoting://localhost");
            jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
            namingContext = new InitialContext(jndiProperties);
        } catch (NamingException e) {
            e.printStackTrace();
        } catch (Exception e1) {
            e1.printStackTrace();
        }
    }

    @Test
    public void testStateless() {
        try {
            ejbRemote = (TestStatelessRemote) namingContext.lookup(REMOTE_JNDI_NAME);
        
            TestCase.assertEquals(ejbRemote.decreaseValue(1), 0);
            TestCase.assertEquals(ejbRemote.increseValue(1), 2);
        } catch (NamingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
 
    @AfterAll
    public static void destroy() {
        try {
            namingContext.close();
        } catch (NamingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
Inserendo, nel clash patch, oltre alla libreria JUnit5 ( creata da eclipse ) il jar ( che ho trovato su internet ) wildfly-naming-client-1.0.4.Final.jar ( che mi risolve l'eccezione NoInitialContext, per l'application server che uso )

Fatto questo, eseguo il codice, e mi viene stampata questa eccezione:

gen 06, 2018 11:41:54 AM org.jboss.naming.remote.client.InitialContextFactory <clinit>
INFO: WFNAM00025: org.jboss.naming.remote.client.InitialContextFactory is deprecated; new applications should use org.wildfly.naming.client.WildFlyInitialContextFactory instead
gen 06, 2018 11:41:55 AM org.wildfly.naming.client.Version <clinit>
INFO: WildFly Naming version 1.0.4.Final

Ovviamente il test non mi si esegue proprio.

Per quando riguarda il recupero dell'interfaccia locale in un web project ( come viene anche mostrato nel capitolo 5 della guida postata qui sopra ) mi funziona tutto correttamente ( premettendo che ho provato solamente il primo codice, non ho ancora provato a recuperare la classe locale tramite la classe InitialContext )

Cmq, ritornando a noi, perché l'unit test non mi funziona?

P.S.: Ah.. Quasi dimenticavo, come application server, sto usando WildFly 11.0.0.Final

EDIT
:

Leggendo bene il codice dell'ore mi sono accordo che la classe InitialContext nel package org.jboss.naming.remote.client è obsoleta ed è stata sostituita, quindi ho modificato la mia unit test cosi:

Codice:
package test;

import static org.junit.jupiter.api.Assertions.*;

import java.util.Properties;

import testing.stateless.TestStatelessRemote;
import javax.naming.*;

import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;

import junit.framework.TestCase;


class IntegrationTest {
    private static Context namingContext;
    private static TestStatelessRemote ejbRemote;
    private static final String REMOTE_JNDI_NAME="/FirstEar/FirstEJBProject/TestStateless!testing.stateless.TestStatelessRemote";
    
    @BeforeAll
    public static void init() {
        try {
            Properties jndiProperties = new Properties();
            jndiProperties.put("jboss.naming.client.ejb.context", true);
            jndiProperties.put(Context.PROVIDER_URL, "http-remoting://localhost");
            jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.wildfly.naming.client.WildFlyInitialContextFactory");
            namingContext = new InitialContext(jndiProperties);
        } catch (NamingException e) {
            e.printStackTrace();
        } catch (Exception e1) {
            e1.printStackTrace();
        }
    }

    @Test
    public void testStateless() {
        try {
            ejbRemote = (TestStatelessRemote) namingContext.lookup(REMOTE_JNDI_NAME);
            
            TestCase.assertEquals(ejbRemote.decreaseValue(1), 0);
            TestCase.assertEquals(ejbRemote.increseValue(1), 2);
        } catch (NamingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    @AfterAll
    public static void destroy() {
        try {
            namingContext.close();
        } catch (NamingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
Ora l'eccezione che mi avverte di non usare l'initialContext obsoleto non appare più, ma mi compare pur sempre l'eccezione:

gen 06, 2018 12:56:12 PM org.wildfly.naming.client.Version <clinit>
INFO: WildFly Naming version 1.0.4.Final

Per risparmiare spazio sul post vi linko un file contenente tutte le eccezioni che JUnit mi da ( cosa che prima non avevo postato:

https://mega.nz/#!fc8EDTyS!8O81gq3jDtf-cabwE5xdCHyaqlfZjVRTlt_yuNY8l5Q
 
Ultima modifica: